c# - SQL SERVER 上的 SqlBulkCopy 标识
问题描述
我尝试使用 SqlBulkCopy 插入数据库,但问题是当 Sql 服务器上的 id 为 identity(1,1) 我收到此错误“无法将值 NULL 插入列‘二’,表‘mydb.dbo.test’;列确实不允许空值。INSERT 失败。”
string connString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True",DbServer,databaseName);
DataTable table = new DataTable("test");
//table.Columns.Add("id");
table.Columns.Add("one", typeof(int));
table.Columns.Add("two", typeof(int));
DataRow row = table.NewRow();
row["one"] = 1;
row["two"] = 2;
table.Rows.Add(row);
DataRow row2 = table.NewRow();
row2["one"] = 1;
row2["two"] = 2;
table.Rows.Add(row2);
SqlBulkCopy bulk = new SqlBulkCopy(connString);
bulk.DestinationTableName = "test";
try
{
bulk.WriteToServer(table);
bulk.Close();
}
catch (Exception ex)
{
Console.WriteLine("error. {0}", ex.Message);
}
finally
{
bulk.Close();
}
编辑表方案:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test](
[id] [INT] IDENTITY(1,1) NOT NULL,
[one] [INT] NOT NULL,
[two] [INT] NOT NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
解决方案
如果您的本地表定义与服务器的不匹配(它缺少标识列),那么您需要为每一列添加显式映射(区分大小写)
第一个值是本地源列的名称,第二个是目标列的名称。
bulk.ColumnMappings.Add("one", "one");
bulk.ColumnMappings.Add("two", "two");
如果名称不完全匹配,也会出现这种情况。
推荐阅读
- excel - 如何将公式仅应用于可见单元格宏
- c++ - 计算数字时除以 0 错误 | C++
- spring - 同步访问共享资源以异步调用 Spring Webserver 似乎不适用于 @Synchronized
- javascript - 使用 Web 组件访问子元素列表
- xml - 使用 XML 数据和 XSLT 使用 HTML 创建不同数量的列
- nestjs - 巢穴。无法从其他模块注入存储库
- python - 获取熊猫组的中位数
- javascript - 初始化前无法访问 {variable-name}(React 导入)
- python - 笨拙数组中的while循环等效函数/片段
- bash - GitLFSPull SCM Jenkins 插件无法正确执行 git lfs pull 来解析指针