TSQL BULK INSERT行错误导致C#异常

时间:2012-07-19 18:46:53

标签: c# sql-server-2008 tsql csv ado.net

我正在处理非常大的分隔文件。这些文件已经过预处理,以确保字段和行分隔符有效。偶尔会处理一行,导致TSQL约束失败(通常是数据类型问题)。在这种情况下,“修复”输入数据不是一种选择。

我们使用MAXERRORS设置可接受的输入错误数,并使用ERRORFILE来记录失败的行。

批量插入在SSMS中完成,严重级别为16的错误消息记录到每个失败行的消息窗口中。尝试通过C#SqlCommand类执行此代码会导致在生成第一个严重性级别16错误消息时抛出异常,从而导致批处理失败。

有没有办法通过C#和SqlCommand之类的东西来完成操作并忽略SQL错误消息?

示例命令:

BULK INSERT #some-table FROM 'filename' 
WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = 'some-file')

3 个答案:

答案 0 :(得分:0)

为什么不使用SqlBulkCopy,然后捕获使用SqlRowsCopied事件复制的行。这将更接近地模仿BULK INSERT T-SQL命令。

编辑:看起来错误处理不是SqlBulkCopy的强大功能。但是,这是一个似乎正在寻找你想要的例子:

http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc

答案 1 :(得分:0)

由于.NET支持所有数据类型为SQL,因此您应该能够在.NET中使用TryParse来捕获任何转换错误。在日期,您还需要在SQL数据范围内进行测试。在文本上需要测试长度。我在一些非常大的插件上做了这个,我解析了一些CSV。 TryParse非常快。比Try Catch更好,因为它没有投掷和错误的开销。

为什么不在.NET C#中插入。有一个批量复制课程。我在解析时使用TVP异步插入,一次做10,000个。

答案 2 :(得分:0)

似乎是对每一行有错误但只是被SQL统计的行抛出异常。但是,它也被传递回 C#(在我的例子中是 SSIS)。我发现当超过 MAXERRORS 发生时,使用 TRY/CATCH 逻辑包装批量插入并使用 THROW(重新抛出异常)对我有用。

开始尝试 BULK INSERT #some-table FROM 'filename' WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = '一些文件') 结束尝试 开始捕捉 扔; 收尾