的ExecuteScalar(); 随着SCOPE_IDENTITY()生成“System.InvalidCastException:指定强制转换无效”

我已经有它接收的各种数据(通过文本框和的CheckBoxList)的一种形式,在click事件,他们插入所有的数据到一个表,然后选择在SCOPE_IDENTITY其存储在一个变量来使用它的的CheckBoxList项目的插入使用循环到另一个表

根据很多答案和例子,这应该很好地工作..但它给了我这个错误!

Exception Details: System.InvalidCastException: Specified cast is not valid. Line 66: int NewBrandId = (int)comm.ExecuteScalar();

这是我的LinkBut​​ton方法的代码:

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();” 我用“选择BrandId从品牌WHERE BrandId = @@身份;” 它可以让你更controlm但我个人prefare的首选解决方案

注:“SELECT @@身份;” 也工作得很好

感谢球员,我希望它帮助别人!

--------------解决方案-------------

究竟comm.ExecuteScalar()返回? 也许它返回longdouble包装成object
记不太清了,但好像我曾面临一些1-2年前。

如果你可以改变SQL,一个更简单的方法是将

SELECT CONVERT(int, SCOPE_IDENTITY())

从对SCOPE_IDENTITY的文档()

Return Types

numeric(38,0)

因此,一个简单的解决方案将是以下

DECLARE @ReturnValue INT;

/*
Do your insert stuff here.
*/

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

正如低糜说,身份是一个SQL数字(.NET小数)。 这应该工作:

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

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

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.368 (s). 10 q(s)