Mag*_*s A 8 c# sql-server sqlbulkcopy sql-server-2008
我正在尝试SqlBulkCopy使用SQL Server管理导入导出向导创建的flatfiles中的类进行批量插入.这些文件以逗号分隔.
文件中的一行可能如下所示:
{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);
}
Run Code Online (Sandbox Code Playgroud)
表定义:
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,
Run Code Online (Sandbox Code Playgroud)
在您DataTable.Columns.Add的数据中,将数据类型作为第二个参数。这应该够了吧。例:
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(Guid));
Run Code Online (Sandbox Code Playgroud)
问题在于 中的空列{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.
Run Code Online (Sandbox Code Playgroud)
原因是 SQL 只允许毫秒的 3 位小数精度。所以你必须四舍五入'2011-04-29 02:54:15.380000000'到'2011-04-29 02:54:15.380',这样就可以正常工作了。
一种方法如此处所述。 或者,您可以修改 CsvReader 代码,以在 CsvReader.GetValue(int) 函数中的值为 string.Empty 时返回 DBNULL。看看这里