使用SQLBulkCopy c#200,000行或信息

时间:2014-08-19 10:55:07

标签: c# sql sqlbulkcopy

我有一个包含3列的数据库表,所有字符串。 我必须上传200,000行信息​​。 我可以做到这一点,但正如你所期望的那样需要太长时间,比如30多分钟。

我现在正在尝试使用SQLBulkCopy来更快地完成它但我无法理解如何正确地执行它。一行数据的样本将是:

"test string","test string,"test string"

我应该将数据写入临时文件,以便SQLBulkCopy可以使用它来上传数据吗? 比如每行代表一行并用逗号分隔数据吗?

到目前为止,这是我所拥有的,任何帮助都会很棒!

//this method gets a list of the data objects passed in

 List<string[]> listOfRows = new List<string[]>(); // holds all the rows to be bulk copied to the data table in th database

foreach (DataUnit dataUnit in dataUnitList)
{         
 string[] row = new string[2];
 row[0] = dataUnit.value1.ToString();
 row[1] = dataUnit.value2.ToString();
 row[2] = dataUnit.value3.ToString() ;
 listOfRows.Add(row);
 }

File.Create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt"));

using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt")))
             {

                 foreach(string[] array in listOfRows)
                 {
                     file.Write(array[0] + "," + array[1] + "," + array[2]);
                 }
             }

             using (MyFileDataReader reader = new MyFileDataReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt")))
             {
                 SqlBulkCopy bulkCopy = new SqlBulkCopy("my connection string to database");
                 bulkCopy.DestinationTableName = "my table name";
                 bulkCopy.BatchSize = 20000; //what if its less than 200,000?

                 bulkCopy.WriteToServer(reader);

                 bulkCopy.Close();

             }  

1 个答案:

答案 0 :(得分:3)

批量插入T-SQL要求源数据存在于DB服务器上的文件中。如果您编写代码,那就不是您想要的方式了。

相反,您应该围绕任何数据源创建适配器。适配器应实现IDataReader接口的部分 - SqlBulkCopy仅使用IDataReader的一些方法,因此只需要实现这些方法:

属性

  • 段计数

方法

  • 的GetName
  • GetOrdinal
  • 的GetValue

(来源:http://www.michaelbowersox.com/2011/12/22/using-a-custom-idatareader-to-stream-data-into-a-database/

因此,除非您的数据已存档,否则无需将其写入文件。只需确保您可以通过IDataReader界面一次显示记录。

避免将数据保存到文件可以节省大量资源和时间。我曾经实现了一个导入作业,它通过XmlReader从FTP数据源读取XML数据,然后将其包装在自定义IDataReader中。这样我就可以将数据从ftp服务器,通过应用服务器流式传输到数据库服务器,而无需将整个数据集写入应用服务器上的磁盘。