C# 加速插入mdb

C# 加速插入mdb,c#,ms-access,C#,Ms Access,有没有办法加快mdb的插入速度 using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename)) while ((line = sr.ReadLine()) != null) { //sanitize the data } 从csv获取约2mil记录需要20秒 但当我加入mdb插入时,我只能在10分钟内获得10000条记录,所以你可以看到这将花费很长时间 using (StreamReader sr

有没有办法加快mdb的插入速度

 using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename))
  while ((line = sr.ReadLine()) != null)
{
   //sanitize the data
}
从csv获取约2mil记录需要20秒 但当我加入mdb插入时,我只能在10分钟内获得10000条记录,所以你可以看到这将花费很长时间

 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;数据源=mypath;喷气式OLEDB:发动机 类型=5“

问候


_Eric

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

另一个可能会加快速度的更改是准备一次命令并创建所有参数。然后在循环中,只需分配参数值并每次执行即可。这样可以避免每次迭代时对语句进行语法分析和语义检查,并且可以在一定程度上缩短时间。但是,我不认为这是一个显著的改进。即使每次都对语句进行语法分析,语句语法分析也应该占总成本的一小部分

您是否可以使用直接从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解析(插入/更新)的速度通常较慢。换句话说,您可能拥有尽可能最高效的代码,但瓶颈是Jet。请记住,在原始发布中,您的连接(打开文件、创建锁、查找文件、插入行、释放锁、关闭文件、释放对象)对于每一行。您需要连接一次(在while之外),读取这些行,生成Sql(OleDbCommand),然后执行。

我在这里找到了一个非常好的解决方案:
不要使用OleDb,而是使用DAO。

使用(StreamReader sr=new StreamReader(\u localDir+“\\”+\u filename))使用(OleDbConnection con=new OleDbConnection(\u conStr))使用(OleDbCommand cmd=new OleDbCommand()),而((line=sr.ReadLine())!=null)没有真正的帮助,它在一分钟内做了275条记录,但谢谢Hanks,我想这就是我目前尝试的方式,在使用后(OleDbCommand cmd=new OleDbCommand())我将cmd设置为con并打开它,还将cmd.command文本设置为插入MyTable值(@p1,@p2…然后b4我在同时执行命令((line=sr.ReadLine())我对当前行执行cmd.params.clear并辞职。我甚至可以循环使用除ExecuteOnQuery及其相当精力充沛之外的所有内容。如果没有ExecuteOnQuery,我可以在32514毫秒内循环2m+记录,当我添加ExecuteOnQuery时,我每行获得约80000条记录min@Eric:该.mdb文件是在本地驱动器上还是在网络驱动器上?它是本地的。我已放弃t正如我所能理解的那样,他的方法是在40秒内读取->清理->写出csv,然后调用Process.Start(“msaccess.exe”,myNewFile)所有这些都在不到一年的时间内完成minute@Eric:酷。这很有效。我很高兴你找到了一个快速的解决方案。我来试一试,但是你知道将分隔符设置为逗号和文本限定符的单引号的实际连接字符串吗。不是要清除ThanksFMT=Delimited应该这样做。上面是一个应该从Access连接运行的查询。当我尝试从[Text;HDR=YES;FMT=Delimited;IMEX=2;DATABASE=C:\\temp\\tempImportfile.csv]中选择*进入MyTable时,我总是收到一条消息:“Microsoft Jet数据库引擎找不到输入表或查询”Text;HDR=YES;FMT=Delimited;IMEX=2;DATABASE=C:\\temp\\tempImportfile.csv“。请确保它存在并且它的名称拼写正确。“它就在那里。谢谢您似乎把方括号放错了地方:[Text;HDR=YES;FMT=Delimited;IMEX=2;DATABASE=C:\temp\].tempmortfile.csv连接字符串位于[]之间由于数据库和外部文件是“表”,这根本不是真的。如果你告诉Jet做正确的事情,它通常会很快完成这类事情。据我所知,原始问题中的代码是一次做一行,这比批量插入要慢得多(这是比较的重点)。任何数据库引擎执行200万行插入的速度都会比在一批中插入200万行的速度慢。我想看看你的基准测试与我的基准测试相比。我发现,在与Excel或Access交谈时,通过互操作会更快,完全绕过Jet。如果我能看到Jet如何更高效,那么我就吃我的d我自己的投票很容易。关于批处理或不批处理,这不是我要说的。请注意我对他打开/关闭方法的附加命令(冲洗,重复)为每一行创建相同的mdb文件,以及这是如何不高效的。如果您正在访问/Jet数据,则不可能绕过Jet!您可以使用低效的方法与Jet对话,并获得较差的性能,这就是原始问题中发生的情况(即,连续一行插入,而不是批量插入)。您需要将逻辑从一次插入一行更改为一次插入整个批次。我不知道C#所以无法告诉您如何执行此操作,但在我看来,这似乎是代码与CSV导入之间存在差异的明显原因。我认为您最好的方法是@Remou给出的方法。