我有一个看起来像这样的表
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
字段输入日期,但不确定如何。
有人经历过这一点,可以指出正确的方向吗?
答案 0 :(得分:0)
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); }