CREcordset - liefert falsches Ergbnis
-
Hallo. Der titel mag etwas verwirren. Aber hier die Frage und die Infos :
ICh habe eine Access Datenbank mittels odbc verbunden. ich benutze CDatabase und CREcordset um OPerationen und abfragen auf der db durchzuführen .Das programm erstellt auf wunsch die db-struktur :
ExecuteSQL(db,"Create table vbLiga ( LigaId AUTOINCREMENT , LigaBez char(100), Aufsteiger int, Absteiger int)"); ExecuteSQL(db,"Create table vbMannschaft ( MannschaftId AUTOINCREMENT , MannschaftBez char(100), MannschaftBezKurz char(20), LigaId int)"); ExecuteSQL(db,"Create table vbSpieler(SpielerId AUTOINCREMENT, SpielerName char(50), SpielerVorname char(50), SpielerAlter int, SprungAufschlag float, FlatterAufschlag float, Standaufschlag float, BaggerAnnahme float, PritschenAnnahme float, Pos4NormalZuspiel float, Pos4SchnellesZuspiel float, Pos3MeterZuspiel float, Pos3KurzZuspiel float, Pos2MeterKopfZuspiel float, Pos4NormalAngriff float,Pos4SchnellAngriff float, Pos3MeterAngriff float,Pos3KurzAngriff float , Pos2MeterKopfAngriff float, Pos2Block float, Pos3Block float, Pos4Block float, MannschaftId int)"); ExecuteSQL(db,"Create table vbAnsetzung( AnsetzungId AUTOINCREMENT, Heim int , Gast int , Tag int, Monat int, Jahr int, Satz1Heim int, Satz2Heim int, Satz3Heim int,Satz4Heim int,Satz5Heim int,Satz1Gast int,Satz2Gast int,Satz3Gast int,Satz4Gast int,Satz5Gast int )"); for (int iSpieler = 0; iSpieler < iAnzahlSpielerMannschaft; iSpieler++) { sql = ""; sql = "INSERT INTO vbSpieler (SpielerVorname, SpielerAlter, SprungAufschlag, FlatterAufschlag, Standaufschlag, BaggerAnnahme, PritschenAnnahme, Pos4NormalZuspiel, Pos4SchnellesZuspiel, Pos3MeterZuspiel, Pos3KurzZuspiel, Pos2MeterKopfZuspiel, Pos4NormalAngriff,Pos4SchnellAngriff, Pos3MeterAngriff, Pos3KurzAngriff, Pos2MeterKopfAngriff, Pos2Block, Pos3Block, Pos4Block, MannschaftId) Values("; sql.insert(sql.size(),"'Spieler',"); // Ermittle Alter sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerAlterMin + rand() % (SpielerAlterMax - SpielerAlterMin))); sql.insert(sql.size(),"',"); // Ermittle Sprungaufschlag sql.insert(sql.size(),"'"); //sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"18"); sql.insert(sql.size(),"',"); // Ermittle FlatterAufschlag sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Standaufschlag sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle BaggerAnnahme sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle PritschenAnnahme sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos4NormalZuspiel sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos4SchnellesZuspiel sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos3MeterZuspiel sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos3KurzZuspiel sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle PosPos2MeterKopfZuspiel sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos4NormalAngriff sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos4SchnellAngriff sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos3MeterAngriff sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos3KurzAngriff sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos2MeterKopfAngriff sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos2Block sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos3Block sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle Pos4Block sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(SpielerStaerkeMin + rand() % (SpielerStaerkeMax - SpielerStaerkeMin))); sql.insert(sql.size(),"',"); // Ermittle MannschaftId sql.insert(sql.size(),"'"); sql.insert(sql.size(),ConvertIntToString(iMannschaftId.m_iVal)); sql.insert(sql.size(),"')"); ExecuteSQL(db,sql.c_str()); }
So das funktioniert auch. Das problem tritt inder tabelle vbSpieler auf. WEnn ich dort werte abfragen will bekomme ich für bestimmte werte 0 aber nicht für alle ! und ich kann an dieser stelle versichern das in der db auch keinen 0 steht- so bekomme ich für den Alter den korrekten wert auf für sprungaufschlag z.b. immmer eine 0.
hier ist die abfrage// Lese aller Spieler aus. rc.Open(CRecordset::forwardOnly,"Select * from vbSpieler"); while (! rc.IsEOF()) { CDBVariant iSpielerId, iSpielerAlter, fSprungAufschlag,fFlatterAufschlag, fStandaufschlag,fBaggerAnnahme, fPritschenAnnahme, fPos4NormalZuspiel, fPos4SchnellesZuspiel, fPos3MeterZuspiel, fPos3KurzZuspiel, fPos2MeterKopfZuspiel, fPos4NormalAngriff, fPos4SchnellAngriff,fPos3MeterAngriff, fPos3KurzAngriff, fPos2MeterKopfAngriff, fPos2Block, fPos3Block, fPos4Block, iIdMannschaft; CString sSpielerName, sSpielerVorname; rc.GetFieldValue("SpielerId",iSpielerId); rc.GetFieldValue("SpielerName",sSpielerName); rc.GetFieldValue("SpielerVorname",sSpielerVorname); rc.GetFieldValue("SpielerAlter",iSpielerAlter); rc.GetFieldValue("SprungAufschlag",fSprungAufschlag); rc.GetFieldValue("FlatterAufschlag",fFlatterAufschlag); /* rc.GetFieldValue("Standaufschlag",fStandaufschlag); rc.GetFieldValue("BaggerAnnahme",fBaggerAnnahme); rc.GetFieldValue("PritschenAnnahme",fPritschenAnnahme); rc.GetFieldValue("Pos4NormalZuspiel",fPos4NormalZuspiel); rc.GetFieldValue("Pos4SchnellesZuspiel",fPos4SchnellesZuspiel); rc.GetFieldValue("Pos3MeterZuspiel",fPos3MeterZuspiel); rc.GetFieldValue("Pos3KurzZuspiel",fPos3KurzZuspiel); rc.GetFieldValue("Pos2MeterKopfZuspiel",fPos2MeterKopfZuspiel); rc.GetFieldValue("Pos4NormalAngriff",fPos4NormalAngriff); rc.GetFieldValue("Pos4SchnellAngriff",fPos4SchnellAngriff); rc.GetFieldValue("Pos3MeterAngriff",fPos3MeterAngriff); rc.GetFieldValue("Pos3KurzAngriff",fPos3KurzAngriff); rc.GetFieldValue("Pos2MeterKopfAngriff",fPos2MeterKopfAngriff); rc.GetFieldValue("Pos2Block",fPos2Block); rc.GetFieldValue("Pos3Block",fPos3Block); rc.GetFieldValue("Pos4Block",fPos4Block); rc.GetFieldValue("MannschaftId",iIdMannschaft);*/ cout<<fFlatterAufschlag.m_fltVal<<"\n"; /* cout<<fSprungAufschlag.m_chVal<<" "<<fPos2MeterKopfAngriff.m_fltVal<<" "<<fStandaufschlag.m_fltVal<<"\n"; // Erzeuge neuen Spieler vbSpieler *tempPlayer = new vbSpieler((string)sSpielerName,(string)sSpielerVorname, iSpielerAlter.m_iVal,fSprungAufschlag.m_fltVal, fFlatterAufschlag.m_fltVal, fStandaufschlag.m_fltVal,fBaggerAnnahme.m_fltVal, fPritschenAnnahme.m_fltVal,fPos4NormalZuspiel.m_fltVal, fPos4SchnellesZuspiel.m_fltVal, fPos3MeterZuspiel.m_fltVal, fPos3KurzZuspiel.m_fltVal,fPos2MeterKopfZuspiel.m_fltVal, fPos4NormalAngriff.m_fltVal, fPos4SchnellAngriff.m_fltVal, fPos3MeterAngriff.m_fltVal, fPos3KurzAngriff.m_fltVal, fPos2MeterKopfAngriff.m_fltVal,fPos2Block.m_fltVal, fPos3Block.m_fltVal, fPos4Block.m_fltVal,iIdMannschaft.m_iVal, iSpielerId.m_iVal); pVectorSpieler.push_back(tempPlayer);*/ rc.MoveNext(); } rc.Close();
kann mir da jemand weiterhelfen
-
1. Besteht denn das Problem ausschließlich für Float-Typen?
2. Ist sql im Insert-Teil ein std::string? Dann wäre es sicherlich besser std::ostringstream zu verwenden als ständig string-Allokationen und Umkopieren zu verwenden.
3. Du brauchst bei numerischen Typen die Werte nicht mit einem Hochkomma zu versehen.
-
Hallo ja also zu 1.es ist wirlich immer nur bei float typen. int und char(50) funktionieren.
-
So ich habe das Problem gefunden :
ICh verwende zum auslesen ja ein CDBVariant Objekt. Verwende ich statt dess einen CString bekomme ich das richtige ergebnis.