【发布时间】:2015-10-14 14:47:17
【问题描述】:
情况:我正在创建一个自动任务,它查询 MySQL(通过 ODBC)并使用 OLEDB 将结果集插入 MS Access 数据库 (.mdb)。
守则:
OleDbConnection accCon = new OleDbConnection();
OdbcCommand mySQLCon = new OdbcCommand();
try
{
//connect to mysql
Connect();
mySQLCon.Connection = connection;
//connect to access
accCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data source= " + pathToAccess;
accCon.Open();
var cnt = 0;
while (cnt < 5)
{
if (accCon.State == ConnectionState.Open)
break;
cnt++;
System.Threading.Thread.Sleep(50);
}
if (cnt == 5)
{
ToolBox.logThis("Connection to Access DB did not open. Exit Process");
return;
}
} catch (Exception e)
{
ToolBox.logThis("Faild to Open connections. msg -> " + e.Message + "\\n" + e.StackTrace);
}
OleDbCommand accCmn = new OleDbCommand();
accCmn.Connection = accCon;
//access insert query structure
var insertAccessQuery = "INSERT INTO {0} values({1});";
// key = > tbl name in access, value = > mysql query to b executed
foreach (var table in tblNQuery)
{
try
{
mySQLCon.CommandText = table.Value;
//executed mysql query
using (var dataReader = mySQLCon.ExecuteReader())
{
//variable to hold row data
var rowData = new object[dataReader.FieldCount];
var parameters = "";
//read the result set from mysql query
while (dataReader.Read())
{
//fill rowData with the row values
dataReader.GetValues(rowData);
//build the parameters for insert query
for (var i = 0; i < dataReader.FieldCount; i++)
parameters += "'" + rowData[i] + "',";
parameters = parameters.TrimEnd(',');
//insert to access
accCmn.CommandText = string.Format(insertAccessQuery, table.Key, parameters);
try
{
accCmn.ExecuteNonQuery();
}
catch (Exception exc)
{
ToolBox.logThis("Faild to insert to access db. msg -> " + exc.Message + "\\n\\tInsert query -> " + accCmn.CommandText );
}
parameters = "";
}
}
}
catch (Exception e)
{
ToolBox.logThis("Faild to populate access db. msg -> " + e.Message + "\\n" + e.StackTrace);
}
}
Disconnect();
accCmn.Dispose();
accCon.Close();
问题:
内存使用率非常高 (300MB++),而 MS Access 文件大小不会不断变化!似乎插入缓存数据而不是将其保存到磁盘。
非常慢!我知道我的查询会在几秒钟内执行,但插入过程需要很长时间。
我尝试在 MS Access 中使用准备好的语句并将值作为参数插入而不是字符串 concat 来创建插入查询。但是我收到此异常消息:
条件表达式中的数据类型不匹配。
有人知道如何解决这个问题或有更好的方法吗?
【问题讨论】:
-
请在投反对票后发表评论>:(
-
MS Access 不符合 ACID,并且 MS 通过在刷新之前将内存用作缓存来利用这一点。由于每行插入的行数以及 MySQL 数据库的位置,所花费的时间可能会很长:它是在同一台机器上还是两者之间有网络?
-
都在同一台机器上。我可以强制它刷新数据到磁盘吗?!
-
你可以试试这个:msdn.microsoft.com/en-us/library/… 但是很有可能它不起作用,因为你使用了超过 1 个 oledb 连接,在旧版本中导致 MS Access(按设计),而不是出于性能原因刷新。
标签: c# mysql ms-access odbc oledb