C++ ADO与OLE DB的连接太慢了
我正在使用ADO连接和记录集对象访问Sybase ASE数据库(OLE DB提供程序) 例如,仅执行SQL语句如下所示: (插入10000行数据)C++ ADO与OLE DB的连接太慢了,c++,sql,database,oledb,sybase,C++,Sql,Database,Oledb,Sybase,我正在使用ADO连接和记录集对象访问Sybase ASE数据库(OLE DB提供程序) 例如,仅执行SQL语句如下所示: (插入10000行数据) \u ConnectionPtr ConnPtr; ConnPtr.CreateInstance(“ADODB.Connection”); ConnPtr->Open(..我的连接字符串、用户ID和密码…); 对于(inti=0;iExecute(“插入我的_表值(1,2,3)”); 或(备选方案): \u记录集RecPtr;RecPtr.Crea
\u ConnectionPtr ConnPtr;
ConnPtr.CreateInstance(“ADODB.Connection”);
ConnPtr->Open(..我的连接字符串、用户ID和密码…);
对于(inti=0;iExecute(“插入我的_表值(1,2,3)”);
或(备选方案):
\u记录集RecPtr;RecPtr.CreateInstance(“ADODB.RecordSet”);
肌体;
//构造并绑定对象。。
...
对于(int i=0;iAddNew(&obj);
这两种方法都能很好地工作并产生预期的结果。唯一的问题是它们都非常慢。使用原始sql语句插入10000行数据只需3~5秒。。另一方面,使用ADO对象完成相同的任务需要40~50秒。 下面是我的一些问题:
任何有数据库经验的人,请参阅
< P>你应该考虑使用<强>准备好的<强>属性,以便SQL查询只编译一次。这对于命令的第一次执行来说是缓慢的,但是对于后续的执行,你将得到更好的性能:_ConnectionPtr ConnPtr;
ConnPtr.CreateInstance("ADODB.Connection");
ConnPtr->Open(....my Connection String, UserID, and Password....);
_CommandPtr CmdPtr;
CmdPtr.CreateInstance("ADODB.Command");
CmdPtr->ActiveConnection = ConnPtr;
CmdPtr->CommandText = "INSERT INTO my_table VALUES (1, 2, 3)";
CmdPtr->PutPrepared(true);
for (int i=0; i<10000; i++)
CommandPtr->Execute(NULL, NULL, adCmdText);
\u ConnectionPtr ConnPtr;
ConnPtr.CreateInstance(“ADODB.Connection”);
ConnPtr->Open(..我的连接字符串、用户ID和密码…);
_CommandPtr-CmdPtr;
CreateInstance(“ADODB.Command”);
CmdPtr->ActiveConnection=ConnPtr;
CmdPtr->CommandText=“插入我的表格值(1、2、3)”;
CmdPtr->PutPrepared(正确);
for(int i=0;iExecute(NULL,NULL,adCmdText);
参考资料:
- MSDN-准备好的属性(ADO):
- MSDN-准备好的属性示例(VC++):
_RecordSet RecPtr; RecPtr.CreateInstance("ADODB.Recordset");
MyObject obj;
// Construct & Bind obj..
...
for (int i=0; i<10000; i++)
RecPtr->AddNew(&obj);
_ConnectionPtr ConnPtr;
ConnPtr.CreateInstance("ADODB.Connection");
ConnPtr->Open(....my Connection String, UserID, and Password....);
_CommandPtr CmdPtr;
CmdPtr.CreateInstance("ADODB.Command");
CmdPtr->ActiveConnection = ConnPtr;
CmdPtr->CommandText = "INSERT INTO my_table VALUES (1, 2, 3)";
CmdPtr->PutPrepared(true);
for (int i=0; i<10000; i++)
CommandPtr->Execute(NULL, NULL, adCmdText);