Problem mit CString
-
Hy,
Ich habe eine CString variable in der ich Daten aus einer Datenbank einfüge.
Im ersten durschlauf funktioniert alles wunderbar, aber im zweiten lauf nicht.
Im zweiten lauf geht er in die schleife und liest alle werte richtig aus.
Nur die werte werden nicht in die variable geschrieben.var += wert;Die ersten werte bleiben aber in der variable.
Meine Frage hatt bzw. hatte jemand von euch schon einmal dieses Problem???
THX
RS
-
Servus,
ich weiss ja nicht ob du im zweiten Durchlauf die Daten vom ersten Durchlauf behalten willst aber setze doch einfach nach dem ersten Durchlauf var.Empty() dann kannst du sicher gehen das die Var leer ist.
Ich weiss nicht ob dir das weiterhilft war nur ne Idee.
*winke*
Hellsgore
-
Danke, aber die Daten benötige ich noch.
In einer Suchfunktion werden die Daten selektiert und dann durch meine Funktion geschickt die dann die Details der Daten aus der DB holt.
Die Daten werden beim auslesen in ein Textfeld geschrieben, damit ich noch Kommentare einfügen kann.
Danach sollen die Daten aus dem Textfeld zum Drucker gesendet werden.
Das funktioniert auch alles nur ich kann maximal ein Datensatz in mein Textfeld schreiben.
Ich habe auch keinerlei Zeichenbegrenzung in der Variable.
Das kuriose ist auch das es am anfang meines Projektes noch funktioniert hat.
Heute schau ich noch mal drüber und es geht einfach nicht mehr.Trotzdem Danke
-
Wenns am Anfang mal funktioniert hat und nun nicht mehr obwohl du nichts mehr dran geändert hast würde ich mal überprüfen ob du vielleicht irgendwo einer Variablen Char oder TCHAR zuviel speicher gegeben hast.
Am besten deklariert man die Dinger immer so damit Dynamisch der Speicher verwendet wird:TCHAR szBuffer[256]; memset(szBuffer,0,sizeof(szBuffer));Ich kann es mir wirklich nicht erklären ich kann mir nur eins vorstellen das dein CString zuviel deiner Daten intuss hat d.h. seine Speicherkapazität überschritten wird das ist aber in dem Fall glaube ich nicht so. Ich denke mal soviel Daten hast du nicht.
Bei mir tauchen solche Sachen erst dann auf, wenn ich Speicher unnötig verpulvere.Hellsgore
-
Oder so:
char szBuffer[256]={0};
-
Funktioniert leider auch nicht.
Aber ich habe etwas herrausgefunden.v_detail += "System "+did+":\r\n"; v_detail += "Computername: "; v_detail += returndb3; v_detail += "\r\nIP Adresse: "; v_detail += returndb4; v_detail += "\r\nSeriennummer: "; v_detail += returndb2; v_detail += "\r\nGeräte Typ: "; v_detail += returndb8; v_detail += "\r\nRamgröße: "; v_detail += returndb5; v_detail += "\r\nBetriebssystem: "; v_detail += returndb6; v_detail += "\r\nServicepack: "; v_detail += returndb7; loaddetailcpu(ID);//Funktioniert im ersten lauf loaddetailloc(returndb10);//Funktioniert im ersten lauf loaddetailher(returndb9);//Funktioniert im ersten lauf loaddetailbem(ID);//Funktioniert im ersten lauf loaddetailmas(ID); //Funktioniert im ersten lauf //Funktioniert auch im ersten lauf nicht??? v_detail += "\r\n"; //Funktioniert wieder??? UpdateData(false);Ich glaub ich dreh am rad

-
Kann es sein das returndb7 0 ist bzw. einer der Werte die angefügt werden sollen '\0' sind ?
-
jo, könnte sehr gut sein, dass eine deiner Funktionen ein '\0' in den String schreibt. Da CString intern ein NULLterminiertes Array verwendet ist der String für CString dann dort natürlich zu Ende.
-
Leider nein. Das wird bei der Eingabe der Daten kontrolliert.
Kein wert darf == 0 oder == NULL sein.
Mal ein Auszug:
*
System 0:
Computername: RECHNERNAME2
IP Adresse: 123.456.789.0
Seriennummer: 123452
Geräte Typ: Workstation
Ramgröße: 128
Betriebssystem: Windows 2000
Servicepack: SP 3
CPU Typ: Intel Pentium(R) III
CPU Speed: 333
CPU Anzahl: 1
Location: Buxdehude
Hersteller: 123
Bemerkung: Bemerkung
Massenspeicher Typ: Diskettenlaufwerk
Massenspeicher Größe: 1.44 MB
Massenspeicher Anzahl: 1
Massenspeicher Typ: CD-Rom Laufwerk
Massenspeicher Größe: 700 MB
*Folgendes ist aber nicht mit drinn:
v_detail += "\r\n";
-
zeig doch mal den Code der funktion loaddetailsmas
-
CString soll ja bis zu 2.000.000 Zeichen oder so in der Grössenordnung verkraften, aber ich hatte auch mal so ein Problem, bei dem ich ständig mit += einen CString verlängert habe. Das hat aber ziemlich schnell schon nicht mehr funktioniert. So in der Nähe von 250 Zeichen war Schluss, da hat er, warum auch immer, nix mehr angehängt.
Mit strcpy(...) und dann vielen strcat(...) anstatt += hat es dann aber doch geklappt.
-
void ChvDlg::loaddetailmas(CString ID) { CString returndb1, returndb2, returndb3; CString SQLString; CDatabase db; CString connectstring = "DSN=myconnect;UID=****;PWD=****"; TRY { bool erg; erg = db.OpenEx(connectstring,CDatabase::noOdbcDialog); if(erg == true) { CRecordset recset( &db ); SQLString = "SELECT MTyp AS MT, MGroesse AS MG, MAnzahl AS MA FROM HMassenspeicher WHERE CID ="; SQLString += ID; SQLString += ";"; recset.Open(CRecordset::forwardOnly,SQLString,CRecordset::readOnly); while( !recset.IsEOF() ) { recset.GetFieldValue("MT",returndb1); recset.GetFieldValue("MG",returndb2); recset.GetFieldValue("MA",returndb3); v_detail += "\r\nMassenspeicher Typ: "; v_detail += returndb1; v_detail += "\r\nMassenspeicher Größe: "; v_detail += returndb2; v_detail += "\r\nMassenspeicher Anzahl: "; v_detail += returndb3; recset.MoveNext(); } db.Close(); } } CATCH(CDBException, e) { CString error = "Folgender Fehler ist aufgetreten:\n"; error = e->m_strError; MessageBox(error,"Error",MB_OK); } END_CATCH; }
-
*aaaaaahhhhhhhrrrrrrrrrgggggggg* 
Nachdem ich in der DB die werte von float auf varchar umgestellt habe funktioniert es wieder?????
*aaaaaahhhhhhhrrrrrrrrrgggggggg* 
@ALL: Danke
-
ähm?
float-werte? Und dann liest du sie in nen CString aus ?!
-
Ganz ehrlich?
Mir ist im moment scheiss egal was ich auslese, hauptsache es funktioniert.
Ich muss Heute die ersten ergebnisse abgeben.
Um alles weitere kann ich mir später sorgen machen.MFG
RS