使用SQL语句向EF db添加数据
控制器:使用SQL语句向EF db添加数据,sql,asp.net-mvc,database,entity-framework,Sql,Asp.net Mvc,Database,Entity Framework,控制器: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(User user) { if (ModelState.IsValid) { string sqlQuery = "INSERT INTO dbo.Users VALUES (" + user.ToString() + ")"; db.Database
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(User user)
{
if (ModelState.IsValid)
{
string sqlQuery = "INSERT INTO dbo.Users VALUES (" + user.ToString() + ")";
db.Database.SqlQuery<User>(sqlQuery);
db.SaveChanges();
Session["User"] = user.UserName;
Session["Pass"] = user.Password;
Session["RoleID"] = user.RoleID;
return RedirectToAction("Index", "Shop");
}
return View(user);
}
已解决 我已经使用SQLServerExpress重新创建了数据库,并确保ID字段将自动递增。
使用ADO.NET实体数据库重新生成数据库。。。在代码中更改了名称,现在一切正常 似乎UserID是自动递增属性,所以从toString()方法中删除这个.UserID。而且,由于不需要UserID,因此如果控制器的(!db.Users.Any())user.UserID=0,则删除此
实际上,SqlQuery方法用于Select查询,而ExecuteSqlCommnad方法用于插入、更新或删除命令
因此,将SqlQuery替换为ExecuteSqlCommnad,它将向表中插入数据
更新
我在您添加问题时创建表,并在控制器中添加以下代码。它将数据插入到表中,没有任何问题
控制器
var user = "'" + "Admin" +
"', '" + "123456" +
"', '" + "Local Host" +
"', '" + "admin@admin.com" +
"', '" + "Local, Host st" +
"', '" + "1" + "'";
var query = "INSERT INTO Users VALUES (" + user + ")";
var context = new YourDbContext();
context.Database.ExecuteSqlCommand(query);
context.SaveChanges();
在执行Database.SqlQuery(SqlQuery)之前,您可能希望在代码中放置一个断点代码>语句并检查是否有正确的SQL insert语句。当断点到达时,复制sqlQuery
varaiable的值(其中包含insert语句),并尝试直接在SSMS查询窗口上执行该值。如果成功插入一条记录,则表示您的查询没有问题
我可以看出你的问题。RoleID
列的类型为int,但在toString()
实现中,在处理字符串字段时将其包装在单引号内
+ "','" + this.RoleID + "'"
如上所述,捕获sqlQuery变量的值,它将告诉您哪里出了问题
编辑:根据OP的评论
您的用户表有一个UserID列,我在Insert语句中没有看到。如果该列设置为获取除UserID列以外的自动增量/标识值,则只有6列。但是Insert语句有7个值
你应该试试下面这个。这里我指定要插入的列。您可以注意到,我传递的列数和值数是匹配的
INSERT INTO dbo.Users (UserName,Password,Name,Email,Address,RoleID)
VALUES
('someUserName','pass','Scott','localhost@local.com','My addrss',0)
另外,请确保如果RoleId
具有角色表的forigen键,则应传递有效的RoleId
,而不是0
仔细评估sql语句,确保为字符串值打开的每个单引号都有正确的单引号结束。发布代码,而不是代码的图片。数据仍然没有插入到表中,在替换它之后,我得到一个错误,说我试图插入的列数与表不匹配(可能是因为用户ID
),所以我添加了用户ID
,之后我一直得到这个错误:System.Data.SqlClient.SqlException:字符串或二进制数据将被截断。
。据我所见,我试图插入的数据与列的类型不匹配或不够长,因此我将所有内容更改为Text
,而不是nchar(10)
,但仍然没有success@kingston951,你能给我看看桌子的结构吗?[拍摄数据类型的表格结构截图,将其上传到任意位置并将URL粘贴到此处]我更新了question@kingston951,根据您的表结构,从insert查询中删除UserID并使用EXECUTESQLCOMNAD,如果仍然没有帮助,则将数据类型文本更改为varchar(MAX)。这是我得到的语句,它实际上不能作为查询插入到dbo中。用户值('Testing123','123456','LocalHost','localhost@local.com“,”Local,Host st',0)
我不明白这句话有什么不对。我试过你写的那句话,发现我真的没有RoleID-0,所以我把它改成了5(客户)然后我得到了这个错误,就像我在第二个答案中写的:msg8152,16级,状态4,第1行字符串或二进制数据将被截断。语句已终止。
+ "','" + this.RoleID + "'"
INSERT INTO dbo.Users (UserName,Password,Name,Email,Address,RoleID)
VALUES
('someUserName','pass','Scott','localhost@local.com','My addrss',0)