[ACCESS] - Abfrage Gibt je nach Verwendung keine Rückwerte
-
Hallo,
ich rufe über
befehl->CommandText = "SELECT..."
aus einer Datenbank Daten ab.
Das ganze erfolgt innerhalb einer Klasse und funktioniert wunderbar.
Da ich aber aus einer Reihe von Klassen auf die Accessdatenbank zugreifen muss, bin ich dabei, eine extra Klasse zu schreiben, über die auf die DB zugegriffen wird.
Bisher funktioniert auch alles wunderbar. Habe bei der dbConnect-Klasse eine Methode
dbConnect::Query(String ^str)
eingefügt. Diese übernimmt den SQL Befehl als String und definiert die Abfrage:
befehl->CommandText = str;
Wenn ich nun Abfrage, kommt jedoch kein Ergebnis zurück. Er wirft auch keine Excetion aus, sondern einfach nur keine Ergebnisreihen. Der Abfragestring ist korrekt, habe ihn mit Copy & Paste übernommen.
Hat jemand ne Idee, warum bei der neuen Funktion kein Ergebnis aus DB zurückkommt?
Grüße Solick
-
Du mußt noch dazu schreiben mit welchem Framework/System Du die Datenbankobjekte verwendest. Also wer definiert befehl?
-
Stimmt, sorry.
Das ganze ist aus
System::Data::OleDb;
befehl und leser sind wie folgt definiert:
System::Data::OleDb::OleDbCommand ^befehl; System::Data::OleDb::OleDbDataReader ^leser;
Grüße Solick
-
Das DbCommand/DbDataReader läuft eigentlich so (ist C# mußt noch umwandeln)
OleDbCommand cmd = new OleDbCommand(sql, cnc); OleDbDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { String s = rdr.GetString(0); }
-
Also so hatte ich es zuerst implementiert und so funktioniert es auch:
befehl = verbindung->CreateCommand(); befehl->CommandText = " SELECT DISTINCT beobachter.beobachter_id, beobachter.beobachter FROM ((termine INNER JOIN stammdaten ON termine.stammdaten_id = stammdaten.stammdaten_id) INNER JOIN (beobachter INNER JOIN beobachter_termin ON beobachter.beobachter_id = beobachter_termin.beobachter_id) ON termine.termine_id = beobachter_termin.termin_id) WHERE (stammdaten.stammdaten_id = " + stammdatenid + ")"; leser = befehl->ExecuteReader(); //Stammdaten auslesen while(leser->Read()) { beobList->Add(gcnew dbBeobachter(leser->GetInt32(0),leser->GetString(1))); }
Dann habe ich eine Klasse dbConnect geschrieben, die Variablen (leser, befehl, verbindung etc.) als Klasseneigenschaften und dann wird wie folgt abgerufen:
System::Data::OleDb::OleDbDataReader ^ret; try { dbConn->Open(); ret = dbConn->Query(" SELECT DISTINCT beobachter.beobachter_id, beobachter.beobachter FROM ((termine INNER JOIN stammdaten ON termine.stammdaten_id = stammdaten.stammdaten_id) INNER JOIN (beobachter INNER JOIN beobachter_termin ON beobachter.beobachter_id = beobachter_termin.beobachter_id) ON termine.termine_id = beobachter_termin.termin_id) WHERE (stammdaten.stammdaten_id = " + stammdatenid + ")"); //Stammdaten auslesen if(ret->RecordsAffected != 0) { while(ret->Read()) { beobList->Add(gcnew dbBeobachter(ret->GetInt32(0),ret->GetString(1))); } } }
In der Klasse ist die Methode Query wie folgt definiert:
System::Data::OleDb::OleDbDataReader ^dbConnect::Query(System::String ^str) { if(stat == true) { try { //Daten aus der DB abfragen befehl = verbindung->CreateCommand(); befehl->CommandText = str; leser = befehl->ExecuteReader(); } catch(OleDbException ^e) { dbConnect::ThrowOleDbException(e); } } return leser; }
Wie gesagt, bei der ersten Implementierung geht es so wie es soll, bei der zweiten (Klasse dbConnect) fragt er brav ab, bekommt aber 0 Ergebnisse zurück. Wenn ich den Abfragestring im VC++ Abfrageeditor kopiere und dort einsetzte gelingt die Abfrage jedoch...
Hab einfach keine Idee, warum die Abfrage durch die Klasse keine Ergebnisse zurückliefert. Habe sogar den Abfragebefehl beim Debuggen rauskopiert und getestet, er funktioniert...
Lg Solick
-
Nimm' mal das RecordsAffected raus. Möglicherweise ist es nur für ExecutweNonQuery gedacht. Wenn keine Zeilen gefunden wurden, wird die while-Schleife sowieso nicht ausgeführt.
-
Tatsache, das wars... ist ja komisch... wieso bewirkt denn die Abfrage, ob Records betroffen sind, dass keine Records mehr betroffen sind?
Auf jeden Fall vielen Dank !!!
LG Solick
-
Lies doch die Doku:
DataTableReader::RecordsAffected Property
Gets the number of rows inserted, changed, or deleted by execution of the SQL statement.
-
Stimmt... gründlich lesen hat noch keinem geschadet...
Danke nochmal
Solick