我有一个包含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();
}
答案 0 :(得分:3)
批量插入T-SQL要求源数据存在于DB服务器上的文件中。如果您编写代码,那就不是您想要的方式了。
相反,您应该围绕任何数据源创建适配器。适配器应实现IDataReader
接口的部分 - SqlBulkCopy
仅使用IDataReader
的一些方法,因此只需要实现这些方法:
(来源:http://www.michaelbowersox.com/2011/12/22/using-a-custom-idatareader-to-stream-data-into-a-database/)
因此,除非您的数据已存档,否则无需将其写入文件。只需确保您可以通过IDataReader
界面一次显示记录。
避免将数据保存到文件可以节省大量资源和时间。我曾经实现了一个导入作业,它通过XmlReader从FTP数据源读取XML数据,然后将其包装在自定义IDataReader
中。这样我就可以将数据从ftp服务器,通过应用服务器流式传输到数据库服务器,而无需将整个数据集写入应用服务器上的磁盘。