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.


Anmelden zum Antworten