C# 从数据库asp.net C请求ID时,指定的强制转换无效
我的问题是,当我想在数据库中插入一个用户时,它不允许我这样做。我试着调试它,但它告诉我的不多。互联网并没有帮助伊瑟,我所写的一切对我来说都是有意义的,但由于某些原因,我无法克服这一点C# 从数据库asp.net C请求ID时,指定的强制转换无效,c#,sql,asp.net,C#,Sql,Asp.net,我的问题是,当我想在数据库中插入一个用户时,它不允许我这样做。我试着调试它,但它告诉我的不多。互联网并没有帮助伊瑟,我所写的一切对我来说都是有意义的,但由于某些原因,我无法克服这一点 string query = "Insert Into [dbo].[People] Values ( @CountryID, @FirstName, @SurName, @Emai
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();
}
然后,我创建了一个新的存储过程,该存储过程将在新方法中调用,然后将该存储过程添加到我的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通过请求变量接收值。此方法放置在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)更易于维护
希望它能帮助那些偶然发现这篇非常古老的帖子的人,你在几年内学到的东西你查询的返回值不是整数,而是小数。 这就是你失败的原因 例如:
// Weird but works
decimal result = (decimal)cmd.ExecuteScalar();
但是,在不更改查询的情况下,使用Convert.ToInt32也可以工作
id = Convert.ToInt32(cmd.ExecuteScalar());
或者,您可以应用上面评论中的建议,或者将查询更改为使用插入的输出
@"Insert Into [dbo].[People] OUTPUT INSERTED.PeopleID
Values (@CountryID, @FirstName, @SurName, @Email, @Score);"
如果PeopleID应该更改为使用您的身份栏的真实名称您可以使用您的字符串执行此操作,@Steve建议也可以 就我个人而言,两者我都很熟悉。 我将把它转换成一个存储过程,并为您省去执行Concat Sql命令的麻烦
string query = "Insert Into [dbo].[People] Values (@CountryID, @FirstName, @SurName, @Email, @Score)SELECT CAST(scope_identity() AS int)";
您可以将Select Scope_标识替换为以下Select CASTscope_标识int;我个人也会将Insert查询转换为存储procedure@MethodMan哦,我的上帝,谢谢你!是的,我用的是MethodMan的,我已经研究这个问题好几天了,但都没能解决它,尝试了很多不同的插入方法。谢谢你的意见!