CRecordset::Update()
-
Hallo,
ich habe ein großes Problem mit meinem Update() von der CRecordet Klasse und zwar folgendes wenn ich Daten in meine Datenbank schreiben möchte mache ich das so:
[cpp] CUserRecordset user; std::vector< std::string > parameters = StringHelper::split( messageFromClient, ';' ); CDatabase FuhrparkData; CString DB_File = "Fuhrpark"; CString strErgebnis; TRY { // Open the database if ( FuhrparkData.Open( DB_File ) != FALSE ) { std::string dataInfo = parameters[0]; strErgebnis = "Select * FROM tbl_Benutzerliste '"; // Allocate the recordset //CRecordset recset( &FuhrparkData ); // Execute the query if( user.Open(CRecordset::forwardOnly,strErgebnis,CRecordset::dynaset) == TRUE ); { user.AddNew(); user.m_Benutzer = parameters[1].c_str(); user.m_Passwort = parameters[2].c_str(); user.m_Personalnummer = parameters[3].c_str(); user.m_Rechte = parameters[4].c_str(); [b]user.Update();[/b] } // Close the database FuhrparkData.Close(); } return "true"; } CATCH(CDBException, e) { } END_CATCH; return "false;[/cpp]"
An der markierten Stelle sollten nun eigentlich meine Daten in die Datenbank geschrieben werden. Aber anstatt dies mit Update zumachen, entsteht eine Exeption und ich kann mir das nicht erklären. hat jemand eine Idee ich selbst weiss nämlich nicht mehr weiter.
Gruß Silver
-
Ergänze bitte mal
CATCH(CDBException, e) { e.ReportError(); }und zeig uns dann die Meldung.
(Wenn die Meldung den Focus hat einfach Strg+C drücken, dann kopierst du den Text und musst nicht abschreiben.
-
die exceptions treten auf wenn die datentyp nicht gleich sind oder die Felder grösse in der db kleiner als was mann von prameter übegibt.
s.b. feld grösse 5 man übergibt hallowelt mit grösse 9 taucht den Fehler
-
Oder ein Pflichfeld ist NULL, oder oder oder. Da muss man die Meldung sehen, dann wirds einfacher.
-
Die Fehlermeldung lautet: "Ungültiger Bezeichner für Attribut/Option" .
Also mir sagt das gar nichts.
-
mir auch nicht .
du muss mit dem debbuger versuchen welche Bezeichner es ist.
-
Laut Google wirds kompliziert:
Um zwischen diesen Verhaltensweisen zu unterscheiden, erhält
SQL_COPT_SS_CONNECTION_DEAD in den Includedateien von
SQL Server 2000 einen neuen Wert. Anwendungen, die dieses Attribut
verwenden und mithilfe der SQL Server 2000-Header erstellt wurden,
geben einen Fehler zurück (HY092, "Ungültiger Bezeichner für
Attribut/Option"), wenn die Anwendungen mit einem SQL Server 7.0-
Treiber ausgeführt werden. Es wird empfohlen, die Anwendung so zu
schreiben, dass sie die verwendete Treiberversion überprüft, bevor
sie "SQLGetConnectAttr" aufruft: Falls die Anwendung mit einem
SQL Server 7.0-Treiber ausgeführt wird, sollte sie
SQL_ATTR_CONNECTION_DEAD anstelle von SQL_COPT_SS_CONNECTION_DEAD
verwenden.Mit "Invalid descriptor for Attribute/Option" findet man wesentlich mehr. Schau mal, ob du fündig wirst, so auf Anhieb war nix dabei.

-
Hmm ok muss ich mal schauen , wenn ich was gefunden habe schreib ich das hier hinein.Trotzdem danke
-
Nach langem hin und her hab ich den Fehler gefunden endlich.

Ich habe eine total verkorkste open() Methode geschrieben:[cpp] if( user.Open(CRecordset::forwardOnly,strErgebnis,CRecordset::dynaset) == TRUE ); [/cpp]Ausserdem habe ich ein Semikolon gesetzt was da überhaupt nichts zu suchen hat, ich frag ich nur wieso der Compiler nicht gemeckert hat.
Die richtige open() Methode muss in meinem Fall so Aussehen:
[cpp]if( user.Open( CRecordset::dynaset, strErgebnis ) == TRUE ))[/cpp]Hmm so ein dummer Fehler und so ein riesen Aufwand
naja hauptsache gelöst 
-
Solche Semikolons werden nicht angemecktert.
Eventuell kannst du mit einem höheren Warninglevel was erreichen.