我有一张桌子,看起来像:
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])
)
我正在从文件加载数据,对其进行解析,对其进行处理并将其上传回去。这是从看起来像这样的数据表中发生的:
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();
我有一个例外说:
违反UNIQUE KEY约束“ AK_Site_Name”。无法在对象“ dbo.Site”中插入重复键。重复的键值为(11/21/2018 5:52:13 AM)。
在调试器中检查我的数据表显示列正确。数据表本身没有错误。
我试图在SSMS中重现此内容,如下所示:
DECLARE @currentd DATETIME = CURRENT_TIMESTAMP;
INSERT INTO [dbo].[Site] (Name, CreatedAt, UpdatedAt) VALUES ('Test', @currentd, @currentd), ('Test', @currentd, @currentd)
当然,正如预期的那样,它运行良好。这使我相信以某种方式为
Name
字段输入日期,但是我不确定如何。有没有人遇到过这种情况,可以指出正确的方向?
最佳答案
dr [0]用于应将ID设置为null的列,因此最终循环应类似于:
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); }