使用SqlBulkCopy插入GUID

c# sqlbulkcopy sql-server sql-server-2008

我正在尝试使用SQL Server管理导入导出向导创建的flatfiles中的SqlBulkCopy类进行批量插入。这些文件以逗号分隔。

文件中的一行可能如下所示:

{DCAD82A9-32EC-4351-BEDC-2F8291B40AB3} ,, {ca91e768-072d-4e30-aaf1-bfe32c24008f},900001:1792756,900001:1792757,basladdning,2011-04-29 02:54:15.380000000,basladdning,2011- 04-29 02:54:15.380000000,{20A3C50E-8029-41DE-86F1-DDCDB9A78BA5}

我得到的错误是:

System.InvalidOperationException未处理
Message =数据源中String类型的给定值无法转换为指定目标列的uniqueidentifier类型。

所以问题是从字符串转换为GUID。

我尝试过以下方法:

  • 尝试了不同的编码,UTF8和ANSI
  • 删除了GUIDS周围的{}
  • 添加''围绕GUIDS,有和没有{}

有什么建议么?在''是的平面文件中,是一个也有Guid作为数据类型的列。该列为NULL,向导将其导出为''。这可能是问题吗?

代码:

using (var file = new StreamReader(filePath))
using (var csv = new CsvReader(file, false)) 
using (var bcp = new SqlBulkCopy(CreateConnectionString()))
{
    bcp.DestinationTableName = "table";
    bcp.WriteToServer(csv);
}

表定义:

CREATE TABLE [beata].[T_FeatureInstance]( 
    [FeatureInstanceId] [uniqueidentifier] NOT NULL, 
    [FeatureInstanceParentId] [uniqueidentifier] NULL, 
    [FeatureTypeAliasId] [uniqueidentifier] NOT NULL, 
    [Uuid] [varchar](1000) NOT NULL, 
    [VersionId] [varchar](50) NOT NULL, 
    [SkapadAv] [varchar](255) NULL, 
    [Skapad] [datetime] NOT NULL, 
    [UppdateradAv] [varchar](255) NOT NULL, 
    [Uppdaterad] [datetime] NOT NULL, 
    [Gs] [uniqueidentifier] NOT NULL,

一般承认的答案

问题是{DCAD82A9-32EC-4351-BEDC-2F8291B40AB3},,{ca91e768-072d-4e30-aaf1-bfe32c24008f}中的空列被解释为''而不是NULL 。我刚刚在我的本地数据库上尝试了一个INSERT STATEMENT ,当我指定NULL而不是''时,该错误就消失了。你可能会得到另一个错误:

Conversion failed when converting date and/or time from character string.

原因是SQL只允许3位十进制精度(毫秒)。所以你必须完成'2011-04-29 02:54:15.380000000''2011-04-29 02:54:15.380' ,它会正常工作。

执行此操作的一种方法如此处所述或者,您可以修改CsvReader代码,以便在CsvReader.GetValue(int)函数中的值为string.Empty时返回DBNULL。看看这里


热门答案

DataTable.Columns.Add包含数据类型作为第二个参数。这应该够了吧。例:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(Guid));


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因