DAO -> ADO; Probleme



  • Guten Morgen,

    ich beschäftige mich seit kurzem mit MFC(bin in einer Ausbildung) und habe zur Zeit ein Projekt vorliegen, dass schon etwas älter ist. Dieses benutzt die DAO-Schnittstelle um zu einer Access-Datenbank zu verbinden. Dieses soll nun zu einer ADO-Schnittstelle umgeändert werden die zu einer SQL CE Datenbank verbindet.

    Hier ist mal ein Beispielcode für das Initialisieren eines Recordsets...

    rs->Open("SELECT * FROM Gesamt",Global::MyDatabase->GetActiveConnection().GetInterfacePtr(),adOpenStatic,
    				adLockReadOnly,adCmdText);
    

    Das klappt soweit auch.

    Ich habe nun folgende Probleme:

    Count

    rs->GetRecordCount();
    

    Klappt leider nicht, ich habe auch schon den CursorType geändert und Sonstiges probiert, hat jedoch nicht geklappt.

    Als kleine Information - die Tabelle enthält 800 000 Zeilen.

    DoDataExchange

    Mein größtes Problem ist dass zuweisen der Zellenwerte in die vorgegebenen Variablen.

    Der vorherige funktionierende DAO-Code sieht so aus:

    void CJapRecordsets::DoFieldExchange(CDaoFieldExchange* pFX)
    {
    	//{{AFX_FIELD_MAP(CJapRecordsets)
    	pFX->SetFieldType(CDaoFieldExchange::outputColumn);
    	DFX_Text(pFX, _T("[NAME1]"), m_NAME1);
    	DFX_Text(pFX, _T("[VORNAME1]"), m_VORNAME1);
    	DFX_Text(pFX, _T("[NAME2]"), m_NAME2);
    	DFX_Text(pFX, _T("[VORNAME2]"), m_VORNAME2);
    	DFX_Text(pFX, _T("[ARTIKEL]"), m_ARTIKEL);
    	DFX_Text(pFX, _T("[TITEL]"), m_TITEL);
    	DFX_Text(pFX, _T("[UNTERTITEL]"), m_UNTERTITEL);
    	DFX_Text(pFX, _T("[AUFLAGE]"), m_AUFLAGE);
    	DFX_Text(pFX, _T("[ORT]"), m_ORT);
    	DFX_Text(pFX, _T("[JAHR]"), m_JAHR);
    	DFX_Text(pFX, _T("[BJAHR]"), m_BJAHR);
    	DFX_Text(pFX, _T("[FORMAT]"), m_FORMAT);
    	DFX_Text(pFX, _T("[ILLUSTRA]"), m_ILLUSTRA);
    	DFX_Text(pFX, _T("[EINBAND]"), m_EINBAND);
    	DFX_Text(pFX, _T("[BEIGABEN]"), m_BEIGABEN);
    	DFX_Text(pFX, _T("[NACHWEIS]"), m_NACHWEIS);
    	DFX_Text(pFX, _T("[ZUSTAND]"), m_ZUSTAND);
    	DFX_Text(pFX, _T("[WÄHRUNG]"), m_W_HRUNG);
    	DFX_Single(pFX, _T("[ZUSCHLAG]"), m_ZUSCHLAG);
    	DFX_Text(pFX, _T("[SIGEL]"), m_SIGEL);
    	DFX_Text(pFX, _T("[KENNZ]"), m_KENNZ);
    	DFX_Double(pFX, _T("[SORT]"), m_SORT);
    	DFX_Byte(pFX, _T("[JAP]"), m_JAP);
    	DFX_Bool(pFX, _T("[MYLISTFLAG]"), m_MYLISTFLAG);
    	DFX_Long(pFX, _T("[ID]"), m_ID);
    	//}}AFX_FIELD_MAP
    }
    

    m_X sind Membervariablen der Klasse.

    Ich kriege diese Funktion einfach nicht für ADO hin.
    Außerdem triggert ADO das Event auch nicht automatisch.

    Dao triggert das Event automatisch beim Open(und nicht nur einmal).

    Ich bitte euch um Hilfe mit meinen zwei Problemen.

    Vielen Dank im Voraus



  • Basix_Dev schrieb:

    Count

    rs->GetRecordCount();
    

    Klappt leider nicht,

    Was meinst du denn damit? Was klappt konkret nicht. Ich denke eher, dass was mit deinem Open nicht stimmt. Welchen Wert liefert denn Open??



  • AndyDD schrieb:

    Was meinst du denn damit? Was klappt konkret nicht. Ich denke eher, dass was mit deinem Open nicht stimmt. Welchen Wert liefert denn Open??

    Open gibt als HRESULT-Wert 0 aus.

    Wenn ich mit folgendem Code durch das Recordset durchloope, funktioniert das wunderbar.

    _bstr_t valField1;
     _bstr_t valField2
    
    if (!rs->EndOfFile)
        {
           while(!rs->EndOfFile)
          {
              valField1 = rs->Fields->GetItem("TITEL")->Value;
              valField2 = rs->Fields->GetItem("Jahr")->Value;
              AfxMessageBox(valField2);
              rs->MoveNext();
           }
    

    rs->GetRecourdCount() ergibt immer -1.


  • Mod

    Lies:
    http://www.slxdeveloper.com/page.aspx?action=viewarticle&articleid=33

    Das kann ja wohl nicht sein. Da muss ja was von ADO stehen...

    CJapRecordsets::DoFieldExchange(CDaoFieldExchange* pFX);
    


  • Martin Richter schrieb:

    Lies:
    http://www.slxdeveloper.com/page.aspx?action=viewarticle&articleid=33

    Das kann ja wohl nicht sein. Da muss ja was von ADO stehen...

    CJapRecordsets::DoFieldExchange(CDaoFieldExchange* pFX);
    

    In meinem aktuellen Code steht das ja auch nicht mehr. Dort steht z.Z.

    void CJapRecordsets::DoDataExchange(CDataExchange* pDX) 
    {
    
    }
    

    Nur weiß ich nicht wie ich dort die Membervariablen zuweise. Außerdem triggert das Event nicht automatisch.


  • Mod

    DoDataExchange wird durch das Framweork aufgerufen.
    Das ist kein Event, das ist ein Callback.

    Von was leitest Du denn CJapRecordsets ab?



  • Martin Richter schrieb:

    DoDataExchange wird durch das Framweork aufgerufen.
    Das ist kein Event, das ist ein Callback.

    Von was leitest Du denn CJapRecordsets ab?

    Von ADODB::_RecordsetPtr.

    Ich versuche das ganze jetzt nochmal anstatt mit dem RecordsetPtr mit CADORecordset abzuleiten.



  • Folgender Code löst nun einen IDispatch Error #3105 aus.

    if(!Global::MyDatabase->IsOpen())					
    		{
    					Global::MyDatabase->Open("Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\JAP-MAIN.sdf;");	
    		}
    
    rs = new CJapRecordsets(Global::MyDatabase);
    
    		if(!rs->IsOpen())
    		{
    
    			rs->Open("SELECT * FROM [Gesamt]",CADORecordset::openQuery);
    	}
    

    Die Datenbank ist offen, das habe ich getestet.


Anmelden zum Antworten