SqlBulkCopy 违反具有错误值的唯一约束
SqlBulkCopy Violates Unique Constraint with Wrong Value
我有一个 table 看起来像:
CREATE TABLE [dbo].[Site]
(
[Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[Name] NVARCHAR(MAX) NOT NULL,
[CreatedAt] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
[UpdatedAt] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
[DeletedAt] DATETIME NULL,
CONSTRAINT [AK_Site_Name] UNIQUE ([Name])
)
我正在从一个文件中加载数据,对其进行解析和操作,然后再上传回来。这发生在数据 table 中,如下所示:
Name | CreatedAt | UpdatedAt
我在读取文件后循环创建它,如下所示:
DataTable dt = new DataTable() { TableName = "Site" };
var dc = new DataColumn("Name", typeof(string)) { Unique = True };
dt.Columns.Add(dc);
dc = new DataColumn("CreatedAt", typeof(DateTime));
dt.Columns.Add(dc);
dc = new DataColumn("UpdatedAt", typeof(DateTime));
dt.Columns.Add(dc);
foreach(var rec in myFile) {
var dr = dt.NewRow();
dr[0] = rec.SiteName;
dr[1] = DateTime.UtcNow;
dr[2] = DateTime.UtcNow;
dt.Rows.Add(dr);
}
最后像这样将它传递给 SqlBulkCopy:
var connection = new SqlConnection(ConnectionString);
var bulkCopy =
new SqlBulkCopy
(connection,
SqlBulkCopyOptions.TableLock |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.UseInternalTransaction,
null
)
{
DestinationTableName = "Site",
BatchSize = 1000
};
connection.Open();
bulkCopy.WriteToServer(dataTable);
connection.Close();
我收到一条异常消息:
Violation of UNIQUE KEY constraint 'AK_Site_Name'. Cannot insert duplicate key in object 'dbo.Site'. The duplicate key value is (11/21/2018 5:52:13 AM).
在调试器中检查我的数据table 显示列是正确的。数据table本身没有错误。
我尝试在 SSMS 中重现此内容,如下所示:
DECLARE @currentd DATETIME = CURRENT_TIMESTAMP;
INSERT INTO [dbo].[Site] (Name, CreatedAt, UpdatedAt) VALUES ('Test', @currentd, @currentd), ('Test', @currentd, @currentd)
当然,正如预期的那样,它运行良好。这让我相信以某种方式为 Name
字段输入了一个日期,但我不确定如何输入。
有没有人遇到过这种情况并能指出正确的方向?
dr[0] 用于应设置为 null 的列 ID,因此最终循环应如下所示:
foreach(var rec in myFile) {
var dr = dt.NewRow();
dr[0] = null;
dr[1] = rec.SiteName;
dr[2] = DateTime.UtcNow;
dr[3] = DateTime.UtcNow;
dt.Rows.Add(dr); }
我有一个 table 看起来像:
CREATE TABLE [dbo].[Site]
(
[Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[Name] NVARCHAR(MAX) NOT NULL,
[CreatedAt] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
[UpdatedAt] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
[DeletedAt] DATETIME NULL,
CONSTRAINT [AK_Site_Name] UNIQUE ([Name])
)
我正在从一个文件中加载数据,对其进行解析和操作,然后再上传回来。这发生在数据 table 中,如下所示:
Name | CreatedAt | UpdatedAt
我在读取文件后循环创建它,如下所示:
DataTable dt = new DataTable() { TableName = "Site" };
var dc = new DataColumn("Name", typeof(string)) { Unique = True };
dt.Columns.Add(dc);
dc = new DataColumn("CreatedAt", typeof(DateTime));
dt.Columns.Add(dc);
dc = new DataColumn("UpdatedAt", typeof(DateTime));
dt.Columns.Add(dc);
foreach(var rec in myFile) {
var dr = dt.NewRow();
dr[0] = rec.SiteName;
dr[1] = DateTime.UtcNow;
dr[2] = DateTime.UtcNow;
dt.Rows.Add(dr);
}
最后像这样将它传递给 SqlBulkCopy:
var connection = new SqlConnection(ConnectionString);
var bulkCopy =
new SqlBulkCopy
(connection,
SqlBulkCopyOptions.TableLock |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.UseInternalTransaction,
null
)
{
DestinationTableName = "Site",
BatchSize = 1000
};
connection.Open();
bulkCopy.WriteToServer(dataTable);
connection.Close();
我收到一条异常消息:
Violation of UNIQUE KEY constraint 'AK_Site_Name'. Cannot insert duplicate key in object 'dbo.Site'. The duplicate key value is (11/21/2018 5:52:13 AM).
在调试器中检查我的数据table 显示列是正确的。数据table本身没有错误。
我尝试在 SSMS 中重现此内容,如下所示:
DECLARE @currentd DATETIME = CURRENT_TIMESTAMP;
INSERT INTO [dbo].[Site] (Name, CreatedAt, UpdatedAt) VALUES ('Test', @currentd, @currentd), ('Test', @currentd, @currentd)
当然,正如预期的那样,它运行良好。这让我相信以某种方式为 Name
字段输入了一个日期,但我不确定如何输入。
有没有人遇到过这种情况并能指出正确的方向?
dr[0] 用于应设置为 null 的列 ID,因此最终循环应如下所示:
foreach(var rec in myFile) {
var dr = dt.NewRow();
dr[0] = null;
dr[1] = rec.SiteName;
dr[2] = DateTime.UtcNow;
dr[3] = DateTime.UtcNow;
dt.Rows.Add(dr); }