执行标量();使用 scope_identity() 生成“System.InvalidCastException:指定的强制转换无效”[重复]
Posted
技术标签:
【中文标题】执行标量();使用 scope_identity() 生成“System.InvalidCastException:指定的强制转换无效”[重复]【英文标题】:ExecuteScalar(); With scope_identity() Generating "System.InvalidCastException: Specified cast is not valid" [duplicate] 【发布时间】:2011-05-23 17:26:56 【问题描述】:我有一个接受各种数据的表单(通过文本框和复选框列表),并且在单击事件时,他们将所有数据插入表中并选择 scope_identity 然后将其存储在变量中以在插入时使用它复选框列表项使用循环进入另一个表
根据许多答案和示例,这应该可以完美运行!..但它给了我这个错误:
Exception Details: System.InvalidCastException: Specified cast is not valid.
Line 66: int NewBrandId = (int)comm.ExecuteScalar();
这是我的链接按钮方法代码:
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 来自品牌 WHERE BrandId = @@Identity;" 它给你更多 controlm 但我个人赞成 第一个解决方案
注意:“选择@@Identity;”也会 工作正常
谢谢大家,希望对大家有所帮助!
【问题讨论】:
有多种原因应该使用 SCOPE_IDENTITY() 而不是 @@IDENTITY。请尝试在您的过程中将 SCOPE_IDENTITY() 转换为 INT。 【参考方案1】:如果您可以更改 SQL,则更简单的方法是
SELECT CONVERT(int, SCOPE_IDENTITY())
【讨论】:
这个问题很老了,但是 +1 以获得另一个简单的可能解决方案【参考方案2】:comm.ExecuteScalar()
究竟返回了什么?
也许它会返回 long
或 double
打包成 object
。
不记得确切,但似乎我在 1-2 年前遇到过一些事情。
【讨论】:
实际上它返回 int,我认为这是在 "(int)comm.ExecuteScalar();" 中使用的正确转换我还直接在 sql server 中测试了这个查询,它工作正常! SCOPE_IDENTITY() 返回小数(38,0),.net 不允许您转换为 int。请参阅下面@Maccer 的建议以轻松更改 proc,否则在 .net 中执行 decimal=>int 转换。 @Rory 您应该将其粘贴为答案,因为这是(您的)正确答案。【参考方案3】:正如 Dimi 所说,身份是一个 SQL 数字(.NET 十进制)。这应该有效:
decimal decimalBrandId = (decimal)comm.ExecuteScalar();
int NewBrandId = (int)decimalBrandId;
【讨论】:
或var newBrandID = (int)(decimal)comm.ExecuteScalar();
【参考方案4】:
来自 SCOPE_IDENTITY()
的文档Return Types
numeric(38,0)
所以一个简单的解决方案如下
DECLARE @ReturnValue INT;
/*
Do your insert stuff here.
*/
SELECT @ReturnValue = SCOPE_IDENTITY();
SELECT @ReturnValue;
【讨论】:
【参考方案5】:尝试在插入之前添加SET NOCOUNT ON;
。
【讨论】:
还是同样的错误! :S 我认为 alexb 的分辨率是正确的,但我确定我的 Id 数据类型是 INT 并且我认为我提供了正确的演员表,而且我已经从这个问题中看到了代码 >> ***.com/questions/1126171/… 我想知道......! =) 然后打印返回到调试输出的值的类型名称,看看它是什么。 我做到了 :) 我的 sql server 2008 返回System.Decimal
打包到“对象”中。尝试使用 System.Convert.ToInt32
而不是 cast。
哇 alexb,我刚刚放弃并试图寻找一些替代解决方案 =).. 这确实很奇怪,很奇怪:S:D
@alexb- 请更新您的答案,以便我将其标记为答案以上是关于执行标量();使用 scope_identity() 生成“System.InvalidCastException:指定的强制转换无效”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果使用多个插入语句,有啥方法可以使用 SCOPE_IDENTITY 吗?