我的问题是,当我想将一个用户插入数据库时,它不会让我。我试图调试它,但它没有告诉我太多。互联网没有帮助,我写的所有内容都对我有意义,但由于某种原因,我无法超越它。
string query = "Insert Into [dbo].[People] Values (
@CountryID,
@FirstName,
@SurName,
@Email,
@Score);" + "Select Scope_Identity();";
int id;
try
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@CountryID", natDP.SelectedValue);
cmd.Parameters.AddWithValue("@FirstName", nameTb.Text);
cmd.Parameters.AddWithValue("@SurName", surnameTB.Text);
cmd.Parameters.AddWithValue("@Email", emailTB.Text);
cmd.Parameters.AddWithValue("@Score", 1);
con.Open();
id = (int)cmd.ExecuteScalar();
}
}
emailTB.Text = id.ToString();
}
修改
不是使用上面的方法来插入参数,而是创建了一个新方法,可以很好地满足上述问题。
我有一个名为PeopleController
的新控制器,在这个控制器中我有以下代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
[Authorize]
public class PeopleController : ApiController //Api controller to resieve ajax requests
{
// For Retrieving Data
HttpRequest request = HttpContext.Current.Request;
// Calling DB object
dbDataContext db = new dbDataContext();
}
然后我创建了一个将在新方法中调用的新sproc,然后将此sproc添加到我的DbContext
对象中。下面的sql是它的外观。
CREATE PROC dbo.sp_People_Insert
(
@CountryID INT,
@FirstName VARCHAR(100),
@SurName VARCHAR(100),
@Email VARCHAR(100),
@Score INT
)AS
BEGIN
INSERT INTO People(CountryID, FirstName, SurName, Email, Score)
VALUES (@CountryID, @FirstName, @SurName, @Email, @Score)
SELECT SCOPE_IDENTITY()
END
GO
最后将要执行的方法。该方法将使用ajax通过request
变量接收值。此方法放在PeopleController中。然后将该ID作为int返回。
// Insert
public int PostPeople()
{
int id = db.sp_People_Insert(
Convert.ToInt32(request["CountyID"]),
request["FirstName"],
request["SurName"],
request["Email"],
Convert.ToInt32(request["Score"])
);
return id;
}
我发现这是一个更优雅的解决方案,并且比将输入传递给服务器我更可维护,而不是使用ajax。
希望有帮助的人会在这篇很老的帖子上绊倒你,这些你在几年后学到的东西
答案 0 :(得分:0)
查询的返回值不是INT,而是小数。 这就是你失败的原因。
例如:
// Weird but works
decimal result = (decimal)cmd.ExecuteScalar();
但是,使用Convert.ToInt32也可以在不更改查询的情况下工作。
id = Convert.ToInt32(cmd.ExecuteScalar());
另外,您可以应用上述评论中的建议或更改您的查询以使用OUTPUT INSERTED
@"Insert Into [dbo].[People] OUTPUT INSERTED.PeopleID
Values (@CountryID, @FirstName, @SurName, @Email, @Score);"
应将PeopleID更改为使用您的IDENTITY列的真实姓名
答案 1 :(得分:0)
你可以用你的字符串来做这件事@Steve所建议的也行 我个人对这两方面都很熟悉。 我会将其转换为存储过程并为您节省做Concat Sql命令的麻烦
string query = "Insert Into [dbo].[People] Values (@CountryID, @FirstName, @SurName, @Email, @Score)SELECT CAST(scope_identity() AS int)";