的ExecuteScalar();使用scope_identity()生成“System.InvalidCastException:指定的强制转换无效”

时间:2010-12-10 20:49:45

标签: c# asp.net sql ado.net webforms

我有一个接受各种数据的表单(通过文本框和复选框列表),在click事件中,他们将所有数据插入表中并选择scope_identity,然后将其存储在变量中,以便在插入时使用它使用循环到另一个表中的checkboxlist项目

根据许多答案和例子,这应该是完美的!但它给了我这个错误:

Exception Details: System.InvalidCastException: Specified cast is not valid.

Line 66:             int NewBrandId = (int)comm.ExecuteScalar(); 

这是我的linkbutton方法代码:

   protected void lnkbtnUploadAndSubmit_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MOODbCenterConnection"].ConnectionString);

        SqlCommand comm = new SqlCommand("INSERT INTO Brands (BrandName, BrandLogo, BrandWebsite, IsBrandVisible) VALUES (@Name, @Logo, @Website, @IsVisible); SELECT scope_identity();", conn);

        comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 50);
        comm.Parameters["@Name"].Value = txtbxBrandName.Text;

        comm.Parameters.Add("@Logo", System.Data.SqlDbType.Text);
        comm.Parameters["@Logo"].Value = fileuploadLogo.PostedFile.FileName;

        comm.Parameters.Add("@Website", System.Data.SqlDbType.Text);
        comm.Parameters["@Website"].Value = txtbxWebsite.Text;

        comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
        comm.Parameters["@IsVisible"].Value = chkbxIsPublished.Checked;
        conn.Open();


        int NewBrandId = (int)comm.ExecuteScalar(); 

        conn.Close();

        foreach (ListItem li in chkbxlstCuisines.Items)
        {
            if (li.Selected)
            {
                conn.Open();

                SqlCommand comm2 = new SqlCommand("INSERT INTO BrandCuisines (CuisineId, BrandId) VALUES (@CuisineId, @NewBrandId)", conn);

                comm2.Parameters.Add("@CuisineId", System.Data.SqlDbType.Int);
                comm2.Parameters["@CuisineId"].Value = li.Value;

                comm2.Parameters.Add("@NewBrandId", System.Data.SqlDbType.Int);
                comm2.Parameters["@NewBrandId"].Value = NewBrandId;
                comm2.ExecuteNonQuery();
                conn.Close();
            }
        }
    }

编辑奇怪的是,当我直接在visual studio的sql server express中运行它时,查询工作正常!

这个奇怪问题的奇怪解释

alexb的第一个解决方案:

  

我做到了:)我的sql server 2008返回   System.Decimal打包成'对象'。   尝试使用System.Convert.ToInt32   而不是演员。

Example : int NewBrandId = System.Convert.ToInt32(comm.ExecuteScalar());

我的第二个解决方案:

  

而不是使用“SELECT   scope_identity();“我用过”SELECT   BrandId来自Brands WHERE BrandId =   @@ Identity;“它会为您提供更多   控制但我亲自推动了   第一个解决方案

     

N.B:“SELECT @@ Identity;”也会   工作得很好

谢谢你们,我希望它可以帮助别人!

5 个答案:

答案 0 :(得分:34)

如果您可以更改SQL,则更简单的方法是

SELECT CONVERT(int, SCOPE_IDENTITY())

答案 1 :(得分:7)

comm.ExecuteScalar()究竟返回了什么? 也许它会将longdouble打包回object 不记得确切,但似乎我曾在1 - 2年前面对过一些事情。

答案 2 :(得分:4)

正如Dimi所说,Identity是一个SQL数字(.NET Decimal)。这应该有效:

decimal decimalBrandId = (decimal)comm.ExecuteScalar(); 
int NewBrandId = (int)decimalBrandId;

答案 3 :(得分:2)

来自 SCOPE_IDENTITY()

的文档
Return Types

numeric(38,0) 

所以一个简单的解决方案将是以下

DECLARE @ReturnValue INT;

/*
   Do your insert stuff here.
*/

SELECT @ReturnValue = SCOPE_IDENTITY();
SELECT @ReturnValue;

答案 4 :(得分:-1)

尝试在插入之前添加SET NOCOUNT ON;