Вставка ошибки построения ASP NET MVC с использованием ВНЕШНЕГО КЛЮЧА

#c# #asp.net #asp.net-mvc

#c# #asp.net #asp.net-mvc

Вопрос:

У меня проблема с получением первичного ключа идентификации от зарегистрированного пользователя с использованием sql-запросов без Enity Framework. Итак, когда я ввожу логин и пароль пользователя из моей базы данных UserDataController, скопируйте userEmail (login) в WorkSpaceController и поместите его в общедоступный файл ActionResult uploadFile (строка useremail) в useremail data. Таким образом, я могу использовать это в запросе в WorkSpaceController, чтобы получить идентификатор с этим электронным письмом. Но проблема в том, что я не могу использовать userId, который я получил в качестве параметра для запроса insert. Посмотрите на приведенный ниже код

UserDataController:

 public class UserDataController : Controller
{
    string constr = ConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
    // GET: UserData
    [HttpGet]
    public ActionResult Login()
    {
        return View();
    }
}
    [HttpPost]
    public ActionResult Login(UserDataClass log) //Авторизация
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "Data Source=DESKTOP-LRLFA5K\SQLEXPRESS;Initial Catalog=FileCloud;Integrated Security=True;MultipleActiveResultSets=True";
        SqlDataReader dr;
        con.Open();
        SqlCommand com = new SqlCommand("select * from UserData where UserEmail ='"   log.UserEmail   "' and UserPassword ='"   log.UserPassword   "'", con);
        dr = com.ExecuteReader();
        if (dr.Read())
        {
            Session["useremail"] = log.UserEmail.ToString();
            return RedirectToAction("UploadFile", "WorkSpace", new { useremail = log.UserEmail.ToString()});
        }
        else
        {
            ViewData["Message"] = "Неправильное имя пользователя или пароль";
        }
        con.Close();
        return View();
    }
}
  

WorkSpaceController:

 public class WorkSpaceController : Controller
{
    int currentid;
    string constr = ConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
    WorkSpaceClass ws = new WorkSpaceClass();
    List<WorkSpaceClass> _ws = new List<WorkSpaceClass>();
    // GET: WorkSpace
    public ActionResult Add()
    {
        return View();
    }
    public ActionResult UploadFile(string useremail)
    {
        UserDataClass info = new UserDataClass();
        info.UserEmail = useremail;
        SqlConnection sqlcon = new SqlConnection(constr);
        string comman = "select UserID from UserData where UserEmail = '"   info.UserEmail   "'"; //??? Вероятно, Email пуст...
        using (SqlCommand sqlcom = new SqlCommand(comman, sqlcon))
        {
            sqlcon.Open();
            currentid = Convert.ToInt32(sqlcom.ExecuteScalar());
        }
        //ws.UserID = id; //UserID не читается
        ViewBag.UserID = currentid;
        sqlcon.Close();
        return View();
    }
    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase doc, string useremail) //Загружаем текстовый файл в БД
    {
        ViewBag.UserEmail = useremail;
        if (doc != null)
        {
            ws.FileName = Path.GetFileName(doc.FileName);
            ws.FileData = new byte[doc.ContentLength];
            doc.InputStream.Read(ws.FileData, 0, doc.ContentLength);
            ws.FileExtension = Path.GetExtension(ws.FileName);
            DateTime FileDate = DateTime.Now;

            SqlConnection sqlcon = new SqlConnection(constr);

            ws.FileDate = FileDate.ToString("dd/MM/yyyy");
            if (ws.FileExtension == ".doc" || ws.FileExtension == ".docx" || ws.FileExtension == ".txt" || ws.FileExtension == ".pdf")
            {
                string FilePath = Path.Combine(Server.MapPath("~/FileData"), ws.FileName); //Указываем дирректорию хранения файла
                doc.SaveAs(FilePath); 
                string command = "insert into FileData(FileName, FileData, FileExtension, FileDate, UserID) values(@FileName, @FileData, @FileExtension, @FileDate, @UserID)";
                sqlcon.Open();
                SqlCommand sqlcom = new SqlCommand(command, sqlcon);
                sqlcom.Parameters.Add("@FileName", SqlDbType.VarChar).Value = ws.FileName;
                sqlcom.Parameters.Add("@FileData", SqlDbType.VarBinary).Value = ws.FileData;
                sqlcom.Parameters.Add("@FileExtension", SqlDbType.VarChar).Value = ws.FileExtension;
                sqlcom.Parameters.Add("@FileDate", SqlDbType.VarChar).Value = ws.FileDate;
                sqlcom.Parameters.Add("@UserID", SqlDbType.Int).Value = currentid; //AN ERROR IS HERE
                sqlcom.ExecuteNonQuery(); //BUT THIS ROW IS DISPLAY ON ERROR LOG AND COLORED AS RED
                sqlcon.Close();
            }
        }
        return View(ws);
    }
  

WorkSpaceClass:

 public class WorkSpaceClass
{
    public string FileName { get; set; }
    public byte[] FileData { get; set; }
    public string FileExtension { get; set; }
    public string FileDate { get; set; }
    public int UserID { get; set; }
}
  

WorkSpaceClass:

 public class UserDataClass
{
    public int UserID { get; set; }
    [Display(Name = "Имя")]
    [Required(ErrorMessage = "Введите имя пользователя")]
    public string UserName { get; set; }
    [Display(Name = "Email")]
    [Required(ErrorMessage = "Введите Email")]
    public string UserEmail { get; set; }
    [Display(Name = "Пароль")]
    [Required(ErrorMessage = "Введите пароль")]
    public string UserPassword { get; set; }
    [Display(Name = "Подтверждение пароля")]
    [Required(ErrorMessage = "Подтвердите пароль")]
    public string ConfirmPassword { get; set; }
    [Display(Name = "Выберите изображение")]
    public byte[] AvatarData { get; set; }
}
  

Это типы столбцов из SQL Server

Итак, если я введу любое число int, например 1 или 2, в строку (sqlcom.Parameters.Add(«@userId», SqlDbType.Int ).Значение = currentid;) на месте «currentid» файл будет загружен текущему пользователю с этим идентификатором. Я думаю, что проблема заключается в строке «currentid = Преобразовать.ToInt32(sqlcom.ExecuteScalar()); » но я не могу представить, как это решить. Надеюсь, вы поможете, ребята, я застрял с этим уже 2 дня. Я новичок в MVC ASP.NET таким образом, эта ошибка может быть типичной для вас… С помощью ViewBag я проверил полученные значения, и это было правильное значение id int из текущего электронного письма, указанного в «useremail».

Комментарии:

1. Не создавайте свою собственную систему аутентификации. Ваш запрос уязвим для SQL-инъекцииl; имя пользователя admin@site.ru' -- позволит вам войти в систему как администратор, независимо от того, правильный пароль или нет. Что касается вашей реальной проблемы, в чем именно проблема? Выдает ли ваш код исключение? Где? И для каких ценностей?

2. @CodeCaster полное название ошибки: «Ошибка сервера в приложении ‘/’. Оператор INSERT конфликтовал с ВНЕШНИМ КЛЮЧОМ «FK__fileData__userId__3E1D39E1». Конфликт произошел в базе данных «FileCloud», таблице «dbo.UserData», столбце «userId». Выполнение инструкции было завершено «. Источник ошибки: строка 71: sqlcom. ExecuteNonQuery(); в WorkSpaceController

Ответ №1:

Я не тестировал ваш код, но ошибка объясняется сама собой. Этот код вставляется FileData для UserID элемента, который не существует в таблице UserData ; и причина этого в том, что значение для currentid теряется.

Когда вы достигнете, UploadFile(HttpPostedFileBase doc, string useremail) вы попадаете в новый запрос, so ViewData и ViewBag не поможет и currentid заблудился. Вам нужен либо TempData , Session либо новый параметр в этом методе действия контроллера, чтобы получить значение для UserId . Если вы ранее сохраняли значение в TempData , попробуйте это:

 if(TempData["UserId"] != null)
{
  ---
  ---
  sqlcom.Parameters.Add("@UserID", SqlDbType.Int).Value = (int)TempData["UserId"];
  ---
}