从 .NET SqlCommand 调用时 SQL Server 批量插入失败
我有一个存储过程,可以在 SQL Server 2005 数据库上批量插入。 当我从某些 SQL 调用此存储过程(传入本地格式文件和数据文件的名称)时,它工作正常。 每次。
但是,当使用 SqlCommand.ExecuteNonQuery
从 C# .NET 3.5 代码调用同一存储过程时,它会间歇性地工作。
当失败时,会生成 SqlException
并指出:
无法批量加载。 格式文件“c:\bulkinsert\MyFile.fmt”中的列号无效
我认为此错误消息不正确。
有没有人在从代码中调用批量插入时遇到过类似的问题?
谢谢。
I have a stored procedure which does bulk insert on a SQL server 2005 database.
When I call this stored procedure from some SQL (passing in the name of a local format file and data file) it works fine. Every time.
However, when this same stored procedure gets called from C# .NET 3.5 code using SqlCommand.ExecuteNonQuery
it works intermittently.
When it fails a SqlException
is generated stating:
Cannot bulk load. Invalid column number in the format file "c:\bulkinsert\MyFile.fmt"
I don't think this error message is correct.
Has anyone experienced similar problems with calling bulk insert from code?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您如何进行批量插入? 通常,问题(在这种情况下)是“c:\”是服务器的“c:\”还是客户端的“c:\”。
然而。 在 C# 代码中,最简单的方法是使用
SqlBulkCopy
。 此类提供从托管代码直接访问批量插入功能,包括映射(尽管我从不打扰它们)。如果文件类似于 csv / tsv / 类似的文件,则 CsvReader 高度受到推崇的。 这提供了
IDataReader
接口,WriteToServer< /code>
使用效率最高。
How are you doing the bulk insert? Usually, the problem (in this scenario) is whether "c:\" is the server's "c:\", or the client's "c:\".
However. from C# code, the simplest approach is to use
SqlBulkCopy
. This class provides direct access to bulk-insert functionality from managed code, including mappings (although I never bother with them).If the file is something like csv / tsv / similar, then CsvReader is highly recommended. This provides the
IDataReader
interface thatWriteToServer
uses most efficiently.我认为问题出在格式文件上。
我不再使用该格式文件,现在它似乎 100% 都可以工作。
我改为在 SQL 中指定字段和行终止符。
I think the problem was todo with the format file.
I am no longer using the format file and it seems to work 100% of the time now.
I specify field and row terminators in the SQL instead.
use
Exec sp_ExecuteSql @Sql;
(100% 工作)exec(@sql)
不是很强大,因为它有一些限制use
Exec sp_ExecuteSql @Sql;
(100% working)exec(@sql)
is not very powerful as it has some limitations