如何解决使用外键
我在使用不带Enity Framework的sql查询时从登录用户获取身份主键时遇到问题。 因此,当我从数据库UserDataController中输入用户的登录名和密码时,将UserEmail(登录)复制到WorkSpaceController,并将其放在useremail数据中的公共ActionResult UploadFile(字符串useremail)中。因此,我可以在WorkSpaceController的查询中使用它来获取此电子邮件的ID。但是问题是我无法使用作为插入查询的参数获得的UserID。看下面的代码
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,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; }
}
This is columns types from SQL Server
因此,如果我在“ currentid”位置文件中将任何类似1或2的int数(sqlcom.Parameters.Add(“ @ UserID”,SqlDbType.Int).Value = currentid;)放在一行中,则会上传到具有此ID的当前用户。 我认为问题是行“ currentid = Convert.ToInt32(sqlcom.ExecuteScalar());”但我无法想象如何解决它。 希望您能帮到我,我已经坚持了两天。我是MVC ASP.NET的新手,因此此错误通常是您的... 使用ViewBag,我测试了我获得的值,它是“ useremail”上当前电子邮件中正确的id int值。
解决方法
我尚未测试您的代码,但错误说明了自己。这段代码正在为表barman@4b412c1875cd:~$ date
Sat Aug 8 02:47:13 UTC 2020
barman@4b412c1875cd:~$ barman recover --target-time "2020-08-08 02:31:00+00:00" postgres-source-db 20200801T030001 /var/log/barman/TESTRESTOREFORTEST
Starting local restore for server postgres-source-db using backup 20200801T030001
Destination directory: /var/log/barman/TESTRESTOREFORTEST
Doing PITR. Recovery target time: '2020-08-08 02:31:00+00:00'
Copying the base backup.
Copying required WAL segments.
Generating recovery configuration
Identify dangerous settings in destination directory.
Recovery completed (start time: 2020-08-08 02:50:46.538480,elapsed time: 1 second)
Your PostgreSQL server has been successfully prepared for recovery!
barman@4b412c1875cd:~$
中不存在的FileData
插入UserID
;原因就是UserData
迷失的价值。
到达currentid
时,您是在新请求中,因此UploadFile(HttpPostedFileBase doc,string useremail)
和ViewData
将无济于事,ViewBag
迷路了。在此控制器操作方法中,您需要currentid
,TempData
或新参数来检索Session
的值。如果您之前已将值保存在UserId
中,请尝试以下操作:
TempData
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。