![](/img/trans.png)
[英]How to read large excel files containing more that 200,000 rows and load that data in datatable in C#
[英]200,000 rows or info with SQLBulkCopy c#
我有一个包含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();
}
批量插入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服务器通过应用程序服务器流式传输到数据库服务器,而不必将整个数据集写入应用程序服务器上的磁盘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.