我正在使用SQL Server 2014开发人员版和Visual Studio 2013 with C#尝试与数据库进行交互。我正在使用SqlClient和SqlParameter类与数据库接口。
尝试插入具有标识列的数据库表时遇到问题。以前使用MySQL时,我只是在语句中省略了“ id”列,并且在查询运行时为我生成了该列,但是SqlClient似乎不喜欢这种方法。
当我执行查询时,我得到:
System.Data.dll中发生了类型为'System.Data.SqlClient.SqlException'的未处理的异常
附加信息:无法将值NULL插入表'INVENTOR.dbo.inv_products'的列'id'中;列>不允许为空。INSERT失败。
该语句已终止。
当我在SQL Server Management Studio中运行查询并且未指定ID值时,查询将毫无问题地执行,并且ID由Identity列为我生成。
如果我尝试在SSMS中指定一个随机数作为ID,则会引发错误,提示我无法在identity列中插入显式值。同样,如果我尝试在身份列中允许空值,则会引发错误。
我用来执行查询的代码:
// Add to products table.
SqlCommand insertProductTable = new SqlCommand("INSERT INTO inv_products(product_name,product_code,product_taxable) VALUES(@name,@sku,@taxable); SELECT SCOPE_IDENTITY();", this.sql);
insertProductTable.Parameters.Add(productName);
insertProductTable.Parameters.Add(productSKU);
insertProductTable.Parameters.Add(productTaxable);
int id = 0; // This is the ID of the product as stored in the table.
this.sql.Open();
id = (int) insertProductTable.ExecuteScalar();
this.sql.Close();
有没有一种方法可以使SqlClient使用身份列正确插入?
在MS-SQL中,“标识”列不是随机数。顾名思义,它是一个唯一值,您可以使用它的值来标识特定行。
正确的方法是不必担心此列的值,并让SQL-Server为您管理它。
如果您仍然希望自己进行管理,则可以运行SET IDENTITY_INSERT ON
,然后可以在ID列中插入任何(唯一)值。
请注意,如果这只是一次尝试,请不要忘记在完成后SET IDENTITY_INSERT OFF
立即运行。
编辑1:
在注释之后,您的C#实现看起来不错。我的建议是使用SQL事件探查器以查看您的服务器确切接收了什么,然后尝试在SSMS中运行它。
我发现它是调试此类问题的最简单方法。
编辑2:在获取Profiler结果之后,我基于它运行了以下脚本:
BEGIN TRAN
create table inv_products (
id int identity(1, 1),
product_name varchar(256),
product_code varchar(256),
product_taxable int
);
GO
exec sp_executesql N'INSERT INTO inv_products(product_name,product_code,product_taxable) VALUES(@name,@sku,@taxable); SELECT SCOPE_IDENTITY();',N'@name nvarchar(12),@sku nvarchar(14),@taxable bit',@name=N'Test Product',@sku=N'LONDTEST546124',@taxable=1
ROLLBACK
一切似乎都运转良好...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句