.NET SqlBulkCopy - 可以排除可为 Null 的字段

.NET SqlBulkCopy - can Null-able fields be excluded

我将数据从 CSV 文件上传到云端的小应用程序。此应用程序在多个服务器上运行,并且每个服务器都生成这样一个文件。

我的应用程序将数据从此 CSV 文件增量导入数据table,并使用 SqlBulkCopy 将其批量加载到 Azure SQL。

目前 Azure SQL 中的 table 与 CSV 文件布局匹配。

蔚蓝SQLTable

CREATE TABLE stg.EventLog(
EventLogID BIGINT PRIMARY KEY,
EventLogDate DATETIME NOT NULL,
EventName VARCHAR(255) NOT NULL,
EventType VARCHAR(50) NOT NULL    
)

然而,一台服务器想要修改他们的 CSV 文件以包含一个额外的字段。所以我必须创建附加列并确保它可以接受 NULL 值。

table 的更新将是:

ALTER TABLE stg.EventLog ADD Comments VARCHAR(1024) NULL

我的应用程序原始同步代码如下所示:

bc = New SqlBulkCopy(cnn)

bc.DestinationTableName = "dbo.EventLog"
bc.BatchSize = 10000

bc.ColumnMappings.Add("LogID", "LogID")
bc.ColumnMappings.Add("LogDate", "LogDate")
bc.ColumnMappings.Add("EventName", "EventName")
bc.ColumnMappings.Add("EventType", "EventType")

bc.WriteToServer(dt)

现在是奇怪的棘手部分。由于公司的繁文缛节,我要到 2021 年 2 月底才能更新其他服务器上的应用程序。但是我必须尽快用 CSV 文件结构的变化来更新服务器。这意味着我需要将额外的列映射添加到应用程序,构建并部署它。

所以我的问题是: 根据上面的 .NET 代码,如果目标 Table 包含一个 NULLable 字段,它是否仍然可以在其他服务器上工作未使用 SqlBulkCopy 映射?

如果需要更多信息,请告诉我。

是的,它会起作用。但是你需要确保你没有使用 SqlBulkCOpyOPtions.KeepNulls,并且该列必须有一个默认值。在这种情况下,您已经有 NULL。对于 NOT NULL 列,您需要一个默认值。进一步查看 here.

来自 MSDN docs 对于 SqlBulkCopyColumnMapping class:

If the ColumnMappings collection is not empty, not every column present in the data source has to be specified. Those not mapped by the collection are ignored.


顺便给SqlBulkCopy一些小技巧:

  1. 你必须用 using
  2. 来处理它
  3. 测试不同的批量大小,它会对性能产生影响。
  4. SqlDataRecord 速度更快,使用的客户端 RAM 更少,尤其是当您从 IEnumerable 流式传输时,但它可能更复杂。如果您已经有一个 DataTable,请不要打扰。
  5. 考虑使用 SqlBulkCopyOptions.TableLock