.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
一些小技巧:
- 你必须用
using
来处理它
- 测试不同的批量大小,它会对性能产生影响。
SqlDataRecord
速度更快,使用的客户端 RAM 更少,尤其是当您从 IEnumerable
流式传输时,但它可能更复杂。如果您已经有一个 DataTable
,请不要打扰。
- 考虑使用
SqlBulkCopyOptions.TableLock
我将数据从 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
一些小技巧:
- 你必须用
using
来处理它
- 测试不同的批量大小,它会对性能产生影响。
SqlDataRecord
速度更快,使用的客户端 RAM 更少,尤其是当您从IEnumerable
流式传输时,但它可能更复杂。如果您已经有一个DataTable
,请不要打扰。- 考虑使用
SqlBulkCopyOptions.TableLock