2

我有一个 C++ 程序,它使用 OLEDBConnection 将大约一百万条记录插入 MS Access DB。为此,我运行INSERT INTO了数百万次查询,以便插入需要很长时间的记录。

数据是在程序中以数组的形式生成的,这是否是我可以一步将数据加载到数据库中以提高性能的任何其他方式?

谢谢!

我用来插入当前记录的循环

for (int i = 0; i < populationSize; i++){
    insertSQL = "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";`
    outputDBConn->runSQLEdit(insertSQL);
}

运行 SQL 查询的方法

void DBConnector::runSQLEdit(String^ query){
    SQLCMD = gcnew OleDbCommand( query, dbConnection );
    SQLCMD->CommandTimeout = 30;
    dbConnection->Open();
    SQLCMD->ExecuteNonQuery();
    dbConnection->Close();
    }
4

2 回答 2

3

为每个插入语句打开/关闭连接似乎非常低效。

标准方法类似于:

  1. 打开连接。
  2. 启动事务(如果支持)。(这对于具有事务的数据库通常非常重要。)
  3. 插入。根据需要重复此步骤。
  4. 提交事务(如果支持)。
  5. 关闭连接。

更新:以下内容不适用于 MS Access。Access不支持 从文字中插入多行。它仅支持从现有数据源插入多行。(尽管这里有一个可能有效的“解决方法”。无论如何,最重要的可能是限制交易数量。)

可以做的另一件事是构建一个插入命令,一次添加多条记录。这可以通过多个语句或多记录插入(如果支持)来完成。它可能会或可能不会比上述更快(取决于网络延迟和数据库引擎等其他因素),并且可能需要进行调整以适应数据库的限制(例如,可能适用于几百条记录立刻)。这应该在如上所述的正确连接/事务使用之后才考虑。

如果我们已经制作了“批量插入”库/模块,我不会感到惊讶......而且我不使用 MS Access,所以我只能希望上述建议是有帮助的 :-)

快乐编码。

于 2011-12-22T06:59:31.600 回答
1

不要对每个命令进行一次插入。将您的代码更改为以下内容:

string strSQLCommand;
for (int i = 0; i < populationSize; i++){
strSQLCommand += "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";`
}
outputDBConn->runSQLEdit(strSQLCommand );

我不确定命令的最大缓冲区大小是多少,因此请进行一些检查,然后在每次插入 X 时获得最佳值以执行一些“中断”。

于 2011-12-22T12:10:07.143 回答