如何从 .csv 中填充 IDataReader 以便与 SqlBulkCopy.WriteToServer(IDataReader) 一起使用

3
今天有人提到,对于大型 .csv 文件,使用 IDataReader 版本的 WriteToServer(注意:数据存储在 .csv 文件中)比使用 DataTables 更快。不幸的是,我很难找到关于如何实际工作/实施的信息。
我找到的唯一链接如下:

http://www.developerfusion.com/article/122498/using-sqlbulkcopy-for-high-performance-inserts/

这是一些问题,需要将其翻译成中文:
  1. 数据实际存储在哪里?
  2. 我是否会逐行导入?
  3. 如何根据特定字符(例如逗号)进行拆分?

这是否很棘手?

谢谢。

2个回答

1

请参阅this。它解释了如何使用ODBC文本提供程序读取CSV文件,然后使用SqlBulkCopy将其导入数据库。例如:

using(var con = new OdbcConnection(
    "Driver={Microsoft Text Driver (*.csv)};" +
    "Dbq=c:\\somepath\\;" + 
    "Extensions=csv"))
{
   con.Open();
   using(var cmd = new OdbcCommand("select * from [" + myCsvFileName + "]", con))
   {
      using(IDataReader reader = cmd.ExecuteReader())
      {
           // Do whatever
      }
   }
}

谢谢回复,兄弟。你和乔都建议使用相同的方法,这让人感到放心。 - Hans Rudel
请考虑使用 Microsoft Text Driver 时可能出现的 64 位问题:https://dev59.com/P0_Ta4cB1Zd3GeqPC7B4 - Niklas Peter

1

从大型CSV文件批量插入数据的一种方法是使用OLE DB Provider for Jet读取CSV文件。

您可以使用Schema.ini文件描述CSV文件格式,并将OleDbDataReader作为参数传递给SqlBulkCopy.WriteToServer方法。


谢谢回复。那么使用这种方法比使用datatable方法更快? - Hans Rudel
针对非常大的文件可能更快,因为它避免了一次性将所有数据加载到内存中的需要。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接