Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ADO与OLE DB的连接太慢了_C++_Sql_Database_Oledb_Sybase - Fatal编程技术网

C++ ADO与OLE DB的连接太慢了

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

我正在使用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.CreateInstance(“ADODB.RecordSet”);
肌体;
//构造并绑定对象。。
...
对于(int i=0;iAddNew(&obj);

这两种方法都能很好地工作并产生预期的结果。唯一的问题是它们都非常慢。使用原始sql语句插入10000行数据只需3~5秒。。另一方面,使用ADO对象完成相同的任务需要40~50秒。

下面是我的一些问题:

  • 这是一个正常的结果吗?我的意思是,很明显,直接sql执行总是比使用ADO之类的东西快,但是性能差异通常有这么大吗

  • 速度瓶颈主要是由ADO造成的吗?还是这个问题与数据库(Sybase)有关

  • <> L> > P>在C++中有没有其他方法来访问OLE DB,而不是使用ADO(更快的备选)??

    任何有数据库经验的人,请参阅

    < 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);