限制插入SQL Server数据库的行数

时间:2010-06-29 13:36:25

标签: c# sql sql-server-2005 visual-studio-2005

我在VS中有一个运行mainform的程序。

该mainform将数据导出到SQL数据库,并将存储过程导入表中。导出的数据是大量数据(600,000 +行)。

我有一个问题。在我的mainform上,我需要一个“数据库写出间隔”。这是将多少“行”导入数据库的数量。

然而,我的问题是如何实现该间隔的步骤。 mainform运行,当主程序完成时,sql仍然将IN数据再持续5-10分钟。

因此,如果我关闭主窗体,则不会导入其余数据。

那里的专业程序员是否知道我可以以某种方式与SQL通信以仅导出用户指定间隔的数据。 Ť

他必须完成我的c#课程。

我不知道从哪里开始。

我不认为计时器会是一个好主意,因为不同的计算机和CPU的表现不同。任何建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果数据是固定格式的(即,每行都会有相同的列,并且不会发生太大变化),您应该查看批量插入。它在插入大量行时非常快。

基础知识是将数据写入文本文件(即csv,但您可以指定所需的分隔符),然后对服务器执行BULK INSERT命令。其中一个参数是您写出的文件的路径。使用它有点痛苦,因为您必须将文件写入服务器上的文件夹(或服务器可以访问的UNC路径),这导致配置Windows共享或在服务器上设置FTP。这听起来就像你想要使用的那样。

以下是关于BULK INSERT的MSDN文档:
http://msdn.microsoft.com/en-us/library/ms188365.aspx

答案 1 :(得分:0)

不是将所有数据导出到SQL而然后尝试中止或管理负载,更好的过程可能是将负载拆分为较小的块(10,000条记录左右)并检查是否用户希望在每次加载后继续。这使您可以更灵活地控制负载,然后将所有600,000条记录转储到SQL并尝试管理该过程。

Tim Coker提到的也是现货。即使您的存储过程正在进行一些数据操作,通过批量插入加载数据并在加载之后运行查询以执行任何必须执行的操作然后通过存储过程运行所有600,000条记录要快得多。

答案 2 :(得分:0)

与之前的所有其他评论一样,我建议您使用BulkInsert。当涉及到大型数据集时,您会惊讶于性能的速度,也许您不再需要关于间隔的概念。插入100k的记录可能只需要几秒钟。

取决于您的代码是如何编写的,ADO.NET通过SqlBulkCopy对BulkInsert本机支持,请参阅下面的代码 http://www.knowdotnet.com/articles/bulkcopy_intro1.html

如果你一直在使用Linq来代码db,那么已经有一些聪明的代码被编写为datacontext的扩展方法,它将linq变换集转换为数据集,并在内部使用ADO.NET来实现批量插入

http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx