使用SqlClient插入SQL Server标识列中的C#错误

镁碳纤维

我正在使用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使用身份列正确插入?

阿维·特纳(Avi Turner)

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用SqlClient类时如何在SQL Server中获取插入的ID?

使用C#错误“无法在表中为标识列插入显式值”

如何使用 C# 在不使用 SQL 中的标识列的情况下获取上次插入和更新的值?

使用 c# 从 SQL Server 检索新插入的 ID 列并显示在文本框字段中

C#和SQL Server查询错误:无法绑定多部分标识符

SQL Server CE 与 SqlClient

使用SQL Server插入C#后返回ID

使用C#插入SQL Server数据库的问题

在C#中使用DbParameter将数据插入SQL Server

使用C#将记录插入SQL Server 2012

在C#中以通用方式从插入中返回标识值

无法使用 System.Data.SqlClient 在 SQL Server 中创建多个用户定义的函数

如何使用SQL Server在现有列中插入记录

如何使用C#在SQL Server中通过SQLCommand插入阿拉伯文本

使用 C#、EF 和 SQL Server 从 Excel 文件中仅插入不存在的行

SQL Server从C#中的.sql文件插入多行

使用c#将行插入到SQL中

当 IDENTITY_INSERT 设置为 OFF 时,C# 无法为表“Rentals”中的标识列插入显式值

SQL Server错误:即使我将IDENTITY_INSERT ON设置为“也不能为标识列插入显式值”

C#错误:无法在SQL中插入记录

如何在 SQL Server 中添加标识列?

SQL Server 2008中的两个标识列

如何在SQL Server中更新标识列?

SQL Server 2014中的大量标识列值跳转

UWP中使用data.sqlclient的SQL Server请求出错

从Datagridview C#在Sql Server Datable中插入数据

如何使用SQL将表中的插入值插入数组?

使用变量的 SQL Server 批量插入

SQL Server-使用多个值插入