2008-10-24 6 views
3

Je suis en train de porter une application C++ Windows existante vers un environnement 64 bits, et c'est l'une de ces erreurs bizarres. Dans l'extrait de code, vous pouvez utiliser openforwardonly et cela fonctionnait parfaitement avec notre ancienne configuration, mais dans l'environnement 64 bits, cela donne le problème de récupérer uniquement le jeu d'enregistrements ONE. Ou il pourrait être un problème avec le MoveNext(); d'ADO. Pour contourner cela, nous avons commencé à utiliser adOpenStatic, et cela a bien fonctionné pour moi pendant un certain temps, mais seulement plus tard réalisé qu'il a un coup de performance et il prend une éternité pour obtenir/itératif à travers les valeurs. Je demande à quelqu'un d'essayer ce code avec les deux drapeaux et de valider le comportement que je vois.Client Oracle avec indicateur OpenforwardOnly dans la connexion à la base de données.

Informations sur les drapeaux ado: http://www.w3schools.com/ADO/met_rs_open.asp

Un autre sujet EE http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_DB/Q_11520558.html

Je me souviens avoir vu un cas de support de MS, mais je ne peux pas y arriver maintenant.

J'apprécierais n'importe quelle aide ou suggestions. Je sais que nous utilisons une technologie ancienne, mais nous voulons passer aux capacités supplémentaires sans trop changer de code.

// 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; 
} 

Répondre

1

En utilisant "adOpenStatic" au lieu de "adOpenForwardOnly" travaillera

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