2 Tabellen (MDB) über ODBC abfragen -> (JOIN)?



  • Hallo zusammen,

    habe immer noch folgendes Problem und ich hoffe es kann mir einer von euch weiterhelfen. Ich habe 2 Tabellen die miteinander verknüpft sind. So ein ähnliches beispiel hattten wir hier letztens schon mal.
    Ich bin mittlerweile so schlau geworden, dass ich für jede Tabelle eine Klasse von CRecordset ableiten muss.
    Soweit so gut!

    Aber wie schaffe ich es jetzt die SQL-Abfrage wie folgt umzusetzen:

    "Select * FROM Table_1, Table_2 WHERE Table_1.ziel = Table_2.id"???

    Wahrscheinlich ist es gar nicht so kompliziert, aber ich steh grad irgendwie auf der Leitung...

    Grüße

    Holger



  • Hy,

    was mir immer geholfen hat war Access.
    Klicke dir einfach zwei Tabellen zusamm und mache dann eine Abfrage zu beiden tabellen.
    Und schon kannstu du dir den SQL Code anschauen.

    MFG

    RS



  • Hallo ReneS,

    SQL ist eigentlich nicht das Prolem. Viel mehr geht es mit darum wie ich es in MSVC umsetzen kann. Habe bisher viel mit php gemacht, und da kann man die Query direkt durchführen. Jetzt bei C++ gibt es ja noch den Filter und so Spielchen. Am liebsten würde ich so na an SQL bleiben wie es geht...

    Naja sei's drum, nochmal mein Problem: Wie kann ich nun die beiden Klassen dazubewegen zusammen zu arbeiten:

    Kann ich die GetDefaultSQL() Funktion dazu benutzen?

    Muss ich selber eine Join-Funktion schreiben?

    ...

    Fragen über Fragen 😉

    Gruß Holger



  • Ich benutze folgenden Code um Abfragen in Access auszuführen:

    #include "afxdb.h"//Datenbank
    #include "odbcinst.h"//Datenbank
    
             CDatabase database;
    	CString SqlString;
    	CString sDriver =  "MICROSOFT ACCESS DRIVER (*.mdb)";
    	CString sDsn;
    	CString sFile = "Tabelle.mdb";
    	int iRec = 0; 	
    	// Build ODBC connection string
    	sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
    	TRY
    	{
    		// Open the database
    		database.Open(NULL,false,false,sDsn);
    		// Allocate the recordset
    		CRecordset recset( &database );
    		// Build the SQL statement
    
    		SqlString = "SELECT Name AS N from Bla;";
    		// Execute the query
    		recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
    		// Loop through each record
    		while( !recset.IsEOF() )
    		{
    			CString idm;
    			recset.GetFieldValue("N",idm);
    
    			c_Liste.InsertItem(0,idm,0);
    
    			recset.MoveNext();
    		}
    		// Close the database
    		database.Close();
    
    	}
    	CATCH(CDBException, e)
    	{
    		CString error;
    		error = "ERROR: Es ist ein Fehler im Modul: \"Bla Bla\" aufgetreten.\nFolgende Fehlernachricht wurde übergeben:\n";
    		error += e->m_strError; 
    		MessageBox(error,"ERROR",MB_ICONSTOP | MB_OK);
    	}
    	END_CATCH;
    

    MFG

    RS



  • Ersetze einfach in ReneS Quellcode seinen SqlString durch deine Join Anweisung dann sollte es gehen.

    SqlString = " Select * FROM Table_1, Table_2 WHERE Table_1.ziel = Table_2.id ";

    So weit ich das in Erinnerung habe brauchst du auch so keine 2 CRecordsets. Es werden alle Felder in eines geschrieben.



  • Nachtrag:

    Geht aber nur wenn du Daten lesen möchtest, bei schreiben wirst du mit einen Join Probleme bekommen, dann musst du die einzelnen Tabellen seperat ansprechen.



  • Join verbindet doch zwei Tabellen, oder?
    Also müsste doch rein Theopraktisch auch das Schreiben von Daten funktionieren.

    Wenn du nur schreiben möchtest kannst du auch folgenden code nehmen:

    #include "afxdb.h"//Datenbank 
    #include "odbcinst.h"//Datenbank 
    
    CDatabase database;
    	CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
    	CString sDsn;
    	CString sFile = "Tabelle.mdb";
    
    	sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
    	TRY
    	{
    		// Open the database
    		database.Open(NULL,false,NULL,sDsn);
    		database.ExecuteSQL("INSERT INTO Bla VALUES('Bla');");
    		database.Close();
    	}
    	CATCH(CDBException, e)
    	{
    		CString error; 
            error = "ERROR: Es ist ein Fehler im Modul: \"Bla Bla\" aufgetreten.\nFolgende Fehlernachricht wurde übergeben:\n"; 
            error += e->m_strError;  
            MessageBox(error,"ERROR",MB_ICONSTOP | MB_OK); 
    	}
    	END_CATCH;
    

    MFG

    ReneS



  • Hallo,

    danke ihr beiden bis jetzt schon mal. Bin eigentlich auch der Meinung, dass das Schreiben machbar wäre, aber zur Not wäre es egal, da könnte ich dann verschiedene Funktionen schreiben...

    Ich werde das jetzt einfach mal ausprobieren und euch dann bescheid geben...

    Falls ich auf die Variante mit 2 Klassen zurückgreifen sollte, werde ich dann wohl noch mal bescheid geben müssen,...

    Gruß

    Holger


Anmelden zum Antworten