加快插入mdb

有没有办法加快插入到mdb?

using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename)) while ((line = sr.ReadLine()) != null) { //sanitize the data } 

对于来自csv的约2mil记录,这需要大约20秒,但是当我添加mdb插入时,我在10分钟内几乎无法获得10,000条记录,因此您可以看到它将永远需要

  using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename)) while ((line = sr.ReadLine()) != null) { //sanitize the data using (OleDbConnection con = new OleDbConnection(_conStr)) using (OleDbCommand cmd = new OleDbCommand()) cmd.Parameters.AddWithValue...//I have 22 params cmd.ExecuteNonQuery(); } 

有没有更好的办法? 连接池? 线程? 这是我的constr Provider = Microsoft.Jet.OLEDB.4.0; Data Source = mypath; Jet OLEDB:Engine Type = 5“

问候

_Eric

您是否可以使用直接从csv插入的查询? 例如:

 SELECT ID,Field1 INTO NewTable FROM [Text;HDR=YES;FMT=Delimited;IMEX=2;DATABASE=C:\Docs\].Some.CSV 

您可以使用与非标准分隔符类似的东西,但是您需要与要导入的文件位于同一目录中的Schema.ini文件。 它只需要包含:

 [tempImportfile.csv] TextDelimiter=' 

您将不得不稍微改变连接字符串,这似乎工作:

 Text;HDR=YES;FMT=Delimited;DATABASE=C:\Docs\ 

Microsoft Jet处理Sql解析(INSERT / UPDATE)一般很慢。 换句话说,您可能拥有最有效的代码,但阻塞点是Jet。 请记住,在您的原始post中,您为每一行发布连接(打开文件,创建锁定,搜索文件,插入行,处置锁定,关闭文件,处置对象)。 你需要连接ONCE(在while之外),读取行,生成Sql(OleDbCommand),然后执行。

您可能通过在使用块内部移动循环来实现一些性能优势。 创建1个连接/命令并执行N次,而不是创建N个连接/命令。

可能会加快一点速度的另一个变化是准备命令一次并创建所有参数。 然后在循环中,只需分配参数值并每次执行它。 这可以避免每次迭代对语句进行解析和语义检查,并且应该改善一些时间。 但是,我认为这不会是一个重大改进。 语句解析应该是总成本的一小部分,即使每次都进行解析。

我在这里找到了一个非常好的解决方案: 在.NET / C#中将大量记录(批量插入)写入Access而不是使用OleDb,使用DAO。