我有一张桌子,看起来像:

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); }

10-04 14:53