Клиент Oracle с флагом OpenforwardOnly при подключении к базе данных. - PullRequest
3 голосов
/ 24 октября 2008

Я портирую существующее приложение C ++ для Windows на 64-битную среду, и это одна из тех странных ошибок. Во фрагменте кода вы можете указать, что я использую openforwardonly, и он работал нормально с нашей старой установкой, но в 64-битной среде это вызывает проблему выборки только ONE набора записей. Или это может быть проблема с MoveNext(); ADO.

Чтобы обойти это, мы начали использовать adOpenStatic, и какое-то время он работал нормально для меня, но только позже понял, что у него есть снижение производительности, и для получения / повторения значений требуется целая вечность. Я прошу кого-нибудь попробовать этот код с обоими флагами и проверить поведение, которое я вижу.

Информация о флагах ado: http://www.w3schools.com/ADO/met_rs_open.asp

Другая тема EE http://www.experts -exchange.com / Программирование / Языки / 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;
}

1 Ответ

1 голос
/ 09 января 2012

Использование «adOpenStatic» вместо «adOpenForwardOnly» будет работать

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