我正在尝试使用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。
我尝试过以下方法:
有什么建议么?在''是的平面文件中,是一个也有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));