这是这个帖子的后续行动.这都是.Net 2.0 ; 对我来说,至少.
从本质上讲,Marc(上面的OP)尝试了几种不同的方法来更新具有100,000条记录的MS Access表,并发现使用DAO连接比使用ADO.Net 快大约10-30倍.我走了几乎相同的路径(下面的例子)并得出了相同的结论.
我想我只是想了解为什么 OleDB和ODBC速度要慢得多,我很想听听自2011年那篇文章以来是否有人找到了比DAO更好的答案.我真的更愿意避免使用DAO和/或自动化,因为他们要求客户端机器具有Access或数据库引擎可再发行(或者我坚持使用不支持.ACCDB的DAO 3.6).
原始尝试; 100,000条记录/ 10列约100秒:
Dim accessDB As New OleDb.OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
accessPath & ";Persist Security Info=True;")
accessDB.Open()
Dim accessCommand As OleDb.OleDbCommand = accessDB.CreateCommand
Dim accessDataAdapter As New OleDb.OleDbDataAdapter( _
"SELECT * FROM " & tableName, accessDB)
Dim accessCommandBuilder As New OleDb.OleDbCommandBuilder(accessDataAdapter)
Dim accessDataTable As New DataTable
accessDataTable.Load(_Reader, System.Data.LoadOption.Upsert)
//This command is what takes 99% of the runtime; loops through each row …Run Code Online (Sandbox Code Playgroud) 我目前正在制作一个全天候运行的应用程序,并不断从OPC服务器收集信息.
我现在需要做的是将此信息发送到数据库(.accdb-file).这需要非常非常快速地发生.我每毫秒从服务器获取一个新值,我需要以相同的速度将该值发送到数据库.最后我每天00:00将数据库压缩为.zip文件.
我一直在搜索网络,就像一个疯子,但我似乎无法找到一个"最新"的教程.到目前为止,我发现的每一个都使用" Microsoft.Jet.OLEDB.4.0 "作为提供者,但它在我的Windows 7 PC上并不存在.
我已经做了一个小应用程序来测试连接,我将附上我现在的代码,以便给你一个我到目前为止所尝试的一些提示,但这似乎都没有用.
private void button1_Click(object sender, EventArgs e)
{
System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream oStream = oAssembly.GetManifestResourceStream("RSLogixDB.accdb");
System.IO.FileStream fileStream = new System.IO.FileStream("C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb", System.IO.FileMode.Create);
byte[] abyt = new byte[oStream.Length];
oStream.Read(abyt, 0, (int)oStream.Length);
fileStream.Write(abyt, 0, (int)oStream.Length);
fileStream.Close();
if (fileStream != null)
{
fileStream.Close();
fileStream = null;
}
if (oStream != null)
{
oStream = null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试的第一种方法,这里我使用了一个用于创建和写入文件的自制类.它不适用于.accdb文件,不幸的是.(第一行的评论包括我尝试过的提供商.
private void button1_Click(object sender, EventArgs e)
{
//sFileDia.ShowDialog();
//Provider=Microsoft.ACE.OLEDB.12.0
//Povider=.NET Framework Data Provider for OLE DB …Run Code Online (Sandbox Code Playgroud) 我知道这些问题相当普遍,但我整天都在搜索,但我找不到合适的方法.
这是我的代码,使用C#将大约100 000个虚拟记录插入到MDB文件中.
OleDbConnection con = new OleDbConnection();
string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
string dbSource = "Data Source = D:/programming/sample.mdb";
con.ConnectionString = dbProvider + dbSource;
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO tblBooks (Title, Price, Tag, Author) VALUES (@title, @price, @tag, @author)";
cmd.Parameters.AddWithValue("@title", "Dummy Text 1");
cmd.Parameters.AddWithValue("@price", 10);
cmd.Parameters.AddWithValue("@tag", "Dummy Text 2");
cmd.Parameters.AddWithValue("@author", "Dummy Text 3");
con.Open();
for (int i = 0; i < 100000; i++)
{
cmd.ExecuteNonQuery();
}
con.Close();
Run Code Online (Sandbox Code Playgroud)
此代码大约需要一分钟才能运行.这是正常的吗?更快地做到这一点的正确方法是什么?