#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"];
---
}