SQL-Befehl ausführen
-
Hallo zusammen,
wegen einer Softwarekomponente musste ich mein Projekt von x86 auf x64 umstellen, und der alte Code, mit dem ich mit meiner Datenbank kommuniziert habe, funktioniert nicht mehr. Konkret möchte ich meine Datenbank updaten, mit folgendem (neuen) Code, komme ich aber nicht weiter:
LPCTSTR lpszConnect = _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=D:\\XXX.mdb;"); CDatabase db; TRY { db.OpenEx(lpszConnect, CDatabase::openReadOnly | CDatabase::noOdbcDialog); LPCTSTR query = L"UPDATE Artikelbestand SET Abgelaufen = 'Ja' WHERE Verfallsdatum <= #" + Datum + L"#;"; CRecordset recset(&db); recset.Open(CRecordset::dynaset, query, CRecordset::none); db.ExecuteSQL(query); } CATCH_ALL(e) { MessageBox(L"Probem Execute", L"ERROR", MB_OK | MB_ICONWARNING); } END_CATCH_ALL db.Close();
Hat jemand eine Idee, woran es liegt?
-
Vermutlich ist der verwendete "DB Treiber" für MS Access nicht 64Bit fähig.
Laut dieser Seite muss man die 64 Bit version der MS Access Database Engine installieren.
-
Ganz vergessen zu erwähnen:
In einer anderen Funktion hab ich schon Daten mittels "SELECT" aus der gleichen Datenbank abgerufen, das ging ohne Probleme (mit dem gleichen Treiber). Nur das Schreiben in die Datenbank geht mit obigem Code leider nicht.
-
Dann lass dir doch mal den Text der Exception anzeigen, vllt hilft dir das weiter.
-
-
m_strError L"Der Datenquellenname ist zu lang\n" ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
-
-
@medic89 sagte in SQL-Befehl ausführen:
-
m_strError L"Der Datenquellenname ist zu lang\n" ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
Der Text ist wohl nicht vollständig (beachte das \n am ende des gezeigten texts). Lass ihn dir doch komplett ausgeben.
Aber ansonsten ist die Meldung doch klar was das problem ist
-
-
Hab das Problem gelöst, "LPCTSTR lpszConnect" hat dem Compiler anscheinend nicht gefallen, ich habe jetzt ein "CString lpszConnect" draus gemacht, und schon funktionierts...
-
Also seit ich aus den LPCTSTR einen CString gemacht habe, läuft alles wie am schnürchen, weiß jemand, woran das liegen könnte?
-
@medic89 sagte in SQL-Befehl ausführen:
Also seit ich aus den LPCTSTR einen CString gemacht habe, läuft alles wie am schnürchen, weiß jemand, woran das liegen könnte?
Sollte keinen Unterschied machen. Bist du sicher dass du sonst nichts geändert hast?
-
LPCTSTR query = L"UPDATE Artikelbestand SET Abgelaufen = 'Ja' WHERE Verfallsdatum <= #" + Datum + L"#;";
@hustbaer beachte das hier eine String Concatenation aus 2 string literalen und einer Variable (Datum, vermutlich von Type CString) stattfinden soll.
Auch wenn Datum ein CString ist, funktioniert das wohl hier nicht, da query auf ein temporary zeigt (wenn ein CString implizit in ein LPCTSTR "konvertiert" werden kann).
Und das temporary ist AFAIK nach ende der Zeile futsch.
-
@firefly sagte in SQL-Befehl ausführen:
LPCTSTR query = L"UPDATE Artikelbestand SET Abgelaufen = 'Ja' WHERE Verfallsdatum <= #" + Datum + L"#;";
@hustbaer beachte das hier eine String Concatenation aus 2 string literalen und einer Variable (Datum, vermutlich von Type CString) stattfinden soll.
Auch wenn Datum ein CString ist, funktioniert das wohl hier nicht, da query auf ein temporary zeigt (wenn ein CString implizit in ein LPCTSTR "konvertiert" werden kann).
Und das temporary ist AFAIK nach ende der Zeile futsch.
Er hat geschrieben dass er
LPCTSTR lpszConnect
geändert hat. Und das sollte wörscht sein. Davon abgesehen stimmt schon was du schreibst. Nur passt es nicht zu dem was @medic89 behauptet geändert zu haben. Wobei ich da eh skeptisch bin, also ob das so wirklich stimmt was er behauptet.
-
@hustbaer Trotz deines Misstrauens kann ich dir Versichern, dass ich nur das geändert habe
@firefly Du hast Recht, die Variable Datum ist ein CString.
-
@medic89 sagte in SQL-Befehl ausführen:
@hustbaer Trotz deines Misstrauens kann ich dir Versichern, dass ich nur das geändert habe
Bist du wirklich sicher, dass du
lpszConnect
auf CString geändert hast und nichtquery
? (möglich ist vieles, wenn der Code UB ist)
-
Ach sorry, natürlich habe ich quer geändert...
-
BTW: Der Thread ist schönes Beispiel dafür warum es eine schlechte Idee ist einen impliziten
operator char const*
(bzw.operator TCHAR const*
o.ä.) anzubieten.ps: Und auch ein gutes Beispiel dafür wieso man beim Beschreiben von Fehlern/Änderungen etc. darauf achten sollte genau das zu beschreiben was passiert ist/was man geändert hat etc. Und auch nicht mehr und auch nicht weniger.