SqlBulkCopy抛出异常:数据源中String类型的给定值无法转换为指定目标列的bigint类型
SqlBulkCopy throws exception: The given value of type String from the data source cannot be converted to type bigint of the specified target column
我第一次尝试使用 SqlBulkCopy
。我有一个 table 这样创建的:
IF NOT EXISTS(SELECT 1 FROM sys.tables
WHERE Name = N'DetectionLoggingTime'
AND Object_ID = Object_ID(N'dbo.DetectionLoggingTime'))
BEGIN
PRINT N'Creating [dbo].[DetectionLoggingTime]...';
CREATE TABLE [dbo].[DetectionLoggingTime]
(
[LogId] INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
[ScreeningId] BIGINT NOT NULL,
[Message] NVARCHAR(255) NOT NULL,
[Time] BIGINT NULL
);
END
我正在尝试以这种方式插入值:
public async Task Handle(DetectionLoggingIntegrationEvent @event)
{
var dt = new DataTable();
dt.Columns.Add("ScreeningId");
dt.Columns.Add("Message");
dt.Columns.Add("Time");
@event.OperationTimePairs.ForEach(pair => dt.Rows.Add(@event.ScreeningId, pair.Key, pair.Value));
using (var sqlBulk = new SqlBulkCopy(_configProvider.MyConnectionString))
{
sqlBulk.DestinationTableName = "DetectionLoggingTime";
sqlBulk.WriteToServer(dt);
}
}
我的感觉是插入试图插入 LogId,我希望它是增量的并由 SQL 服务器自动生成。我做错了什么?
这个问题通常是在 DataTable
中的列类型不明确之前引起的。
例如,设置列类型可能会修复该错误:
var dt = new DataTable();
dt.Columns.Add("ScreeningId", typeof(long));
dt.Columns.Add("Message");
dt.Columns.Add("Time", typeof(long));
有关此问题的更多文档:https://sqlbulkcopy-tutorial.net/type-a-cannot-be-converted-to-type-b
找到解决方案,需要显式列映射:
public async Task Handle(DetectionLoggingIntegrationEvent @event)
{
var dt = new DataTable();
dt.Columns.Add("ScreeningId", typeof(long));
dt.Columns.Add("Message");
dt.Columns.Add("Time", typeof(long));
@event.OperationTimePairs.ForEach(pair => dt.Rows.Add(@event.ScreeningId, pair.Key, pair.Value));
using (var sqlBulk = new SqlBulkCopy(_configProvider.FdbConnectionString))
{
var mapping = new SqlBulkCopyColumnMapping("ScreeningId", "ScreeningId");
sqlBulk.ColumnMappings.Add(mapping);
mapping = new SqlBulkCopyColumnMapping("Message", "Message");
sqlBulk.ColumnMappings.Add(mapping);
mapping = new SqlBulkCopyColumnMapping("Time", "Time");
sqlBulk.ColumnMappings.Add(mapping);
sqlBulk.DestinationTableName = "DetectionLoggingTime";
sqlBulk.WriteToServer(dt);
}
}
我第一次尝试使用 SqlBulkCopy
。我有一个 table 这样创建的:
IF NOT EXISTS(SELECT 1 FROM sys.tables
WHERE Name = N'DetectionLoggingTime'
AND Object_ID = Object_ID(N'dbo.DetectionLoggingTime'))
BEGIN
PRINT N'Creating [dbo].[DetectionLoggingTime]...';
CREATE TABLE [dbo].[DetectionLoggingTime]
(
[LogId] INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
[ScreeningId] BIGINT NOT NULL,
[Message] NVARCHAR(255) NOT NULL,
[Time] BIGINT NULL
);
END
我正在尝试以这种方式插入值:
public async Task Handle(DetectionLoggingIntegrationEvent @event)
{
var dt = new DataTable();
dt.Columns.Add("ScreeningId");
dt.Columns.Add("Message");
dt.Columns.Add("Time");
@event.OperationTimePairs.ForEach(pair => dt.Rows.Add(@event.ScreeningId, pair.Key, pair.Value));
using (var sqlBulk = new SqlBulkCopy(_configProvider.MyConnectionString))
{
sqlBulk.DestinationTableName = "DetectionLoggingTime";
sqlBulk.WriteToServer(dt);
}
}
我的感觉是插入试图插入 LogId,我希望它是增量的并由 SQL 服务器自动生成。我做错了什么?
这个问题通常是在 DataTable
中的列类型不明确之前引起的。
例如,设置列类型可能会修复该错误:
var dt = new DataTable();
dt.Columns.Add("ScreeningId", typeof(long));
dt.Columns.Add("Message");
dt.Columns.Add("Time", typeof(long));
有关此问题的更多文档:https://sqlbulkcopy-tutorial.net/type-a-cannot-be-converted-to-type-b
找到解决方案,需要显式列映射:
public async Task Handle(DetectionLoggingIntegrationEvent @event)
{
var dt = new DataTable();
dt.Columns.Add("ScreeningId", typeof(long));
dt.Columns.Add("Message");
dt.Columns.Add("Time", typeof(long));
@event.OperationTimePairs.ForEach(pair => dt.Rows.Add(@event.ScreeningId, pair.Key, pair.Value));
using (var sqlBulk = new SqlBulkCopy(_configProvider.FdbConnectionString))
{
var mapping = new SqlBulkCopyColumnMapping("ScreeningId", "ScreeningId");
sqlBulk.ColumnMappings.Add(mapping);
mapping = new SqlBulkCopyColumnMapping("Message", "Message");
sqlBulk.ColumnMappings.Add(mapping);
mapping = new SqlBulkCopyColumnMapping("Time", "Time");
sqlBulk.ColumnMappings.Add(mapping);
sqlBulk.DestinationTableName = "DetectionLoggingTime";
sqlBulk.WriteToServer(dt);
}
}