SQL befehl übergeben
-
müssen die spaltenname nicht in [], also [Spaltenname]?
-
hallo isabeau,
Die Zeile wirkt wie WHERE NAME = '...' in einem SQL-Statement. Obwohl damit dein eigentliches Problem immer noch nicht wirklich gelöst ist.
stimmt das Problem ist noch nicht gelöst.
hallo daniel12345
müssen die spaltenname nicht in [], also [Spaltenname]?
laut msdn nicht, ich kanns aber heute nachmittag versuchen.
-
Hallo ich bins nochmal,
leider funktioniert es auch mit [] nicht.
Wenn ich statt Kontaktperson einen * einfüge (für alles) dann bekomme ich keine Fehlermeldung. Sobald ich einen Namen von einer Spalte eingebe bekomme ich die Fehlermeldung zur Laufzeit des Programms "Fehler beim abrufen eines Datensatzes!" Der Fehler kommt von der Open()-Funktion.
Hier nochmal mein Code.void CMaterialAnlegenView::OnBnClickedSucheLieferant() { CTabLieferanten mTabLief; mTabLief.Open( CRecordset::snapshot,"SELECT Kontaktperson FROM Lieferanten",CRecordset::readOnly ); mTabLief.MoveFirst(); CString strTest=(CString)mTabLief.m_Kontaktperson; mTabLief.Close(); }
Muss ich vielleicht etwas in der von CRecordSet abgeleiteten Klasse verändern?
Ich bin langsam am verzweifeln, weil laut der MSDN und paar anderen Nachforschungen sollte es so eigentlich mit dem SQL-Statement funktionieren.Gruß
bbatec
-
Hallo ich bins nochmal
Lässt sich das ohne Fehler öffnen ?mTabLief.Open(CRecordset::snapshot, "SELECT Kontaktperson AS KONTAKT FROM Lieferanten", CRecordset::readOnly);
Oder vielleicht das:
mTabLief.Open(CRecordset::forwardOnly, "SELECT Kontaktperson AS KONTAKT FROM Lieferanten", CRecordset::readOnly);
-
Hallo isabeau,
werde ich heute nachmittag mal probieren, bin gerade auf der Arbeit.
Eine Frage was ist
".... KONTAKT ...."
?
Gruß
bbatec
-
Ich vermute einfach mal, dass das nicht klappt, weil ein ganz bestimmtes Feld angefordert wird. Irgendwo hiess es mal, dass das Ergebnis von so einem SELECT in die erste Spalte der Tabelle geschrieben wird. Vielleicht passen die Datentypen nicht zusammen ?
Naja, egal. Ich hatte jetzt diese Idee:
mit dem "AS KONTAKT" in dem Select-Statement wird praktisch ein neues Feld "KONTAKT" erstellt (kann auch anders benannt werden), in dem das Ergebnis von dem Select eingetragen wird. Also anstatt zu sagen "gib mir alles aus dem Feld Kontaktperson" und das dann auszulesen sagst du jetzt "gib mir alles aus dem Feld Kontaktperson in dem neuen Feld KONTAKT" und dann liest du das aus.
Und an die Daten kommt man dann so (wenn es funktioniert):CRecordset rs; // bzw. dein CRecordTest rt; CString strAbfrage; CString strErgebnis; strAbfrage.Format("SELECT Kontaktperson AS KONTAKT FROM Lieferanten"); rs.Open(CRecordset::forwardOnly, strAbfrage, CRecordset::readOnly); while(!rs.IsEOF()) { rs.GetFieldValue("KONTAKT", strErgebnis); AfxMessageBox(strErgebnis); // nur zur Kontrolle rs.MoveNext(); } rs.Close();
-
Hallo isabeau,
funktioniert leider nicht, bekomme jetzt folgende Fehlermeldung
"Ungültiger Zeichenwert für Konvertierungsangabe. bei Spalte 1 (KONTAKT)"
-
Hallo ich bins nochmal
wenn ich nach der 1. Spalte Slectiere also
mTabLief.Open( CRecordset::snapshot,"SELECT LieferantenNr FROM Lieferanten",CRecordset::readOnly );
LieferantenNr steht in der 1. Spalte dann funktioniert es, muss ich dem SQL-Befehl mitgeben in welcher Spalte er selektieren muss?
Gruß
BBATEC
-
Hallo hat einer eine Idee?
-
könnte vielleicht helfen:
bei klappts immer und ich definiere mit nen makro, und das sieht so aus:#define SQL_UPDATELIST(DB, TAB) (CString) "SELECT * FROM " + DB + "." + TAB + ";"
ich habe vorsichtshalber immer den datenbanknamen angegeben und ein semikolon am ende der anweisung. das semikolon kann man weglassen, habe ich mal gehört.
versuchs mal
-
Hallo Red Skall,
kannst du mir mal bitte ein bischen dein Code erklären,
irgendwie weiß ich es nicht wie ich das bei meinem Problem anwenden kann/soll.Danke dir!
-
wenn du diese zeile in dein prggramm schreibst (ausserhalb einer funktion am besten) dann kannst du dieses makro "benutzen".
das machst du so:
mTabLief.Open( CRecordset::snapshot,"SQL_UPDATELIST("Datenbankname", "Tabellenname"), CRecordset::readOnly );
die funktion der #define - anweisung erklärt sich von selbst:
er setzt die in den klammern stehenden begriffe in die anweisung (rechts) ein.das erspart dir schreibarbeit wenn du den befehl mehrfach verwndest und macht es übersichtlich