Kann Tabelle aus Datenbank nicht zweimal bearbeiten...
-
Hallo,
Ich habe ein kleines(?!) Problem. Ich schreibe im Moment eine Anwendung die auf eine Datenbank zugreift, eine Tabelle anspricht und diese in ein Recordset lädt um sie zu bearbeiten. Das funktioniert auch alles Wunderbar, aber wenn die Spalte in der Tabelle die ich bearbeiten will, nicht <NULL> ist, also bereits einen Wert zugewiesen bekommen hat, dann bekomme ich folgenden Fehler:
Debug Assertion Failed!
Woran liegt denn das? Ich gebe zu ich bin absoluter Neuling auf dem Gebiet Datenbanken und genau deswegen treibt es mich in den Wahnsinn!
Hier ein wenig Source:
try{ //Datenbankverbindung CDatabase pDB; pDB.OpenEx(strConnect, CDatabase::useCursorLib); //Recordset KCPPFL1RSet CPPFL(&pDB); CPPFL.Open(KCPPFL1RSet::snapshot, _T(DynaSQL)); CPPFL.MoveNext(); do { CPPFL.Edit(); CPPFL.m_Spaltenname = NeuerInhalt; CPPFL.Update(); CPPFL.MoveNext(); } while (!CPPFL.IsEOF() && ++i<iMax && c++<iMax && k++<iMax+2); if(CPPFL.IsEOF()) { CPPFL.MovePrev(); CPPFL.Edit(); CPPFL.m_Spaltenname = NeuerInhalt; CPPFL.Update(); } //Schließe Recordset CPPFL.Close(); //Trenne Verbindung zur Datenbank pDB.Close(); } catch( CDBException* p ) { p->ReportError(); p->Delete(); }So, lasse ich das Script nun einmal durchlaufen und in der Tabelle befindet sich in der Spalte "Spaltenname" (hier gek. durch m_Spaltenname) der Wert <NULL> in JEDER Zeile, dann läuft das Script einwandfrei durch. Ist nun aber die Spalte "Spaltenname" schon gefüllt, weil ich das Script vll. ein zweites Mal durchlaufen lasse, dann bekomme ich die o.g. Fehlermeldung und mein Script bricht ab. - Warum?

Vielen vielen Dank, das ihr euch mir annehmt, ich bin wirklich mit meinem Latein am Ende.
Liebe Grüße,
Julian.
IDE: Microsoft Visual Studio .NET 2003
OS: MS Windows XP Professional
DB: MS SQL
-
Geh das mal mit dem Debugger durch. Den Umgang mit dem kannst du nie zu früh lernen.

-
Hi,
ich kenne mich mit "MS SQL" gar nicht aus .... aber ein Problem (das ich von DB2 her kenne) könnte auch sein, dass das Schreiben auf der Tabelle den dahinterliegenden Cursor ungültig macht (entweder prinzipiell oder man muss ihn mit "for update" deklarieren/öffnen).
JulianB schrieb:
...
... do { ... CPPFL.Update(); CPPFL.MoveNext(); } ...Dazu müsstest Du die Doku wälzen (und wahrscheinlich nicht mal ein Debugger würde Dir dabei helfen).
Gruß,
Simon2.
-
Okay, dann fang ich mal an zu wälzen. Vielen vielen Dank ich melde mich wenns voran geht.
Liebe Grüße,
Julian
-
So ich habs hinbekommen, die Lösung war eigentlich nicht schwer, nur schwer zu finden.
Also ich habe eine Tabelle in der jede Zeile einer Spalte als char(4096) deklariert wird.
CRecordset, reserviert automatisch aber immer nur char(255) pro Zeile, was heißen soll, wenn man im Recordset mehr Speicherplatz reserviert, ist alles so wie es sein soll.RFX_Text(pFX, _T("[Spaltenname]"), m_Spaltenname, 5000);Auf die 5000 kommt es an, damit reserviere ich nun char(5000) und mein Datensatz wird beim zweiten mal Bearbeiten nicht mehr abgeschnitten, ergo mein Programm stürzt nicht mehr ab.
So jedenfalls meine Theorie! Doch siehe da, sie geht! Ich weiß nur nicht ob meine Erklärung so stimmt, ich bin ziemlich schlecht wenns ums Erklären geht.

Vielen vielen Dank an euch!!!
Liebe Grüße,
Julian
-
Hi,
also spätestens bei
JulianB schrieb:
...jede Zeile einer Spalte ...
hängst Du mich ab.
"Spalten" haben üblicherweise keine "Zeilen" ...Gruß,
Simon2.