database - 数据库连接中带有 OpenforwardOnly 标志的 Oracle 客户端。

标签 database oracle visual-c++ 64-bit

我正在将现有的基于 Windows 的 C++ 应用程序移植到 64 位环境,这是其中一个奇怪的错误。 在代码片段中,您可以看到我正在使用 openforwardonly,它过去在我们的旧设置中运行良好,但在 64 位环境中,它给出了仅获取 ONE 记录集的问题.或者可能是 ADO 的 MoveNext(); 有问题。

为了规避它,我们开始使用 adOpenStatic,它对我来说工作了一段时间,但后来才意识到它会影响性能,并且需要永远获取/迭代值。 我请求某人使用这两个标志尝试此代码并验证我看到的行为。

关于ado标志的信息: http://www.w3schools.com/ADO/met_rs_open.asp

另一个EE主题 http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_DB/Q_11520558.html

我记得看过一个 MS 支持案例,但我现在无法访问。

如果有任何帮助或建议,我将不胜感激。我知道我们使用的是旧技术,但我们希望在不改变代码太多的情况下转向附加功能。

// Dbtest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <time.h>

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

int main(int argc, char* argv[])
{  
    HRESULT hr = S_OK;
    try
    {
        CoInitialize(NULL);

        _bstr_t strCnn("Provider=OraOLEDB.Oracle;Data Source =****; User Id=****; password=***");
        _ConnectionPtr m_pConn;

        hr=m_pConn.CreateInstance(__uuidof(Connection));

        if(FAILED(hr))
        {
            printf("Failed creating record set instance\n");
            return 0;
        }

        m_pConn->Open(strCnn,"","",NULL);

        //Open the Record set for getting records from Author table
        _RecordsetPtr pRstDoctors = NULL;
        time_t start,end1,end2;
        pRstDoctors.CreateInstance(__uuidof(Recordset));
        time(&start);

        pRstDoctors->Open("select logid from log",strCnn, adOpenForwardOnly,
                  **adLockReadOnly**,adCmdText);

        //Declare a variable of type _bstr_t

        int valField1;
        //int valField2;

        pRstDoctors->MoveFirst();

        //Loop through the Record set
        if (!pRstDoctors->EndOfFile)
        {
            while(!pRstDoctors->EndOfFile)
            {
                valField1 = pRstDoctors->Fields->GetItem("logid")->Value.intVal;
                // valField2 = pRstDoctors->Fields->GetItem("reportid")->Value.intVal;
                // printf("%d - \n",valField1);
                pRstDoctors->MoveNext();
            }
        }
        time(&end1);

        double dif=difftime(end1,start);
        printf("time difference is %.2lf",dif);
    }
    catch(_com_error e)
    {
        printf("Error:%s\n",e);
    }

    CoUninitialize();
    return 0;
}

最佳答案

使用“adOpenStatic”而不是“adOpenForwardOnly”会起作用

pRstDoctors->Open("select logid from log",strCnn, adOpenStatic,
               **adLockReadOnly**,adCmdText);

关于database - 数据库连接中带有 OpenforwardOnly 标志的 Oracle 客户端。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/234606/

相关文章:

php: mysql 数据库连接正常但无法执行查询

sql - 数据库模式 SQL 行与列

mysql - 这个查询写得好吗?我对此很陌生,想知道是否有更好的方法来编写它

mysql - 查找特定日期内的数据?

c++ - 在 Visual C++ Express 2010 中创建静态库

c++ - 在 MSVC++ 中检查字节代码时遇到问题

visual-studio-2005 - Visual Studio 2005 Express Edition 在任何地方仍然合法可用吗?

Oracle TIMESTAMP 带时区数据类型混淆

sql - 在单个 SQL 查询中,查询可以从单个表中使用多少个索引?

sql - Oracle Exadata - LEFT OUTER JOIN 在连接条件下使用 AND 时表现得像 INNER