加快插入mdb

时间:2010-02-11 23:34:45

标签: c# ms-access

有没有办法加快插入到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 类型= 5"

此致

_Eric

5 个答案:

答案 0 :(得分:5)

您是否可以使用直接从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\

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我在这里找到了一个非常好的解决方案:Writing large number of records (bulk insert) to Access in .NET/C# 而不是使用OleDb,使用DAO。