我有一个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();
}
似乎非常低效为每个插入语句打开/关闭连接。
标准的方法是这样的:
- 打开连接。
- 启动事务,如果支持。(对于具有事务的数据库,这通常非常重要。)
- 插入。根据需要重复此步骤 提交事务,如果支持。
- 紧密联系。
Update:以下内容不适用于MS Access。Access不支持从文字插入多行。它只支持从现有数据源插入多行。(尽管这里有一个可能有效的"变通方法"。在任何情况下,最重要的事情可能是限制事务的数量。
还可以做的一件事是构建一个单个插入命令,一次添加多个记录。这可以通过多个语句或多记录插入(如果支持)来完成。它可能比快,也可能不会比快(取决于其他因素,如网络延迟和数据库引擎),并且可能需要调整以适应数据库的限制(例如,一次可能只适用于几百条记录)。在如上所述的正确连接/事务使用之后,应该只考虑。
如果我们已经制作了"批量插入"库/模块,我不会感到惊讶……我不使用MS Access,所以我只能希望上面的建议是有帮助的:-)快乐编码。
每个命令不要只插入一个。把你的代码改成这样:
string strSQLCommand;
for (int i = 0; i < populationSize; i++){
strSQLCommand += "INSERT INTO [" + pTableName + "] (" + columnsName + ") VALUES (" + columnsValue[i] + ");";`
}
outputDBConn->runSQLEdit(strSQLCommand );
我不确定命令的最大缓冲区大小,所以做一些检查,然后得到最佳值,在每个X插入做一些"休息"