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的,我已经研究这个问题好几天了,但都没能解决它,尝试了很多不同的插入方法。谢谢你的意见!