Datenbankabfrage nur 1 mal ausführbar ??? Dannach Absturz ???? Bitte helft mir !!!!
-
hi,
ich habe eine software entwickelt die bei mir ohne probleme funktioniert!
ich hab nun von hand die odbcverbindung eingerichtet und das anlegen der datensätze funktioniert auch.
wenn ich auf ändern des per select (adoquery) geholten datensatzes allerdings zugreifen will bekomme ich folgende fehlermeldung:zugriffsverletzung bei adresse 1f453e7e in modul 'msado15.dll'. schreiben von adresse 00c37010.
hier mal ein stückchen code:
void __fastcall TfrmRevierEDIT::cboxRevierEnter(TObject *Sender) { Image1->Picture->LoadFromFile(".//img//act//top.bmp"); lblInfo->Visible = false; cboxRevier->Clear(); // alte SQL bereinigen frmDB->ADOQuery1->Close(); frmDB->ADOQuery1->SQL->Clear(); // SQL Abfrage erstellen frmDB->ADOQuery1->SQL->Add("SELECT PID, Name, Vorname FROM Personal"); frmDB->ADOQuery1->SQL->Add("WHERE Status = 'on'"); // SQL an die DB übertragen frmDB->ADOQuery1->ExecSQL(); frmDB->ADOQuery1->Open(); int PID; String Name, Vorname; frmDB->ADOQuery1->First(); while(!frmDB->ADOQuery1->Eof) { // Inhalte auswerten und an Combobox übergeben ... PID = frmDB->ADOQuery1->FieldByName("PID")->AsInteger; Name = frmDB->ADOQuery1->FieldByName("Name")->AsString; Vorname = frmDB->ADOQuery1->FieldByName("Vorname")->AsString; cboxRevier->Items->Add(Name + " - " + Vorname); frmDB->ADOQuery1->Next(); } frmDB->ADOQuery1->Close(); }
nach längeren test kommt es mir so vor das ich denn obigen code auf denn rechner genau nur 1 mal ausführen kann !!!!!
dann ist schluss, sprich der erste aufruf funktioniert und dannach immer der obige fehler.noch zur info, beide rechner enthalten winxp office2000, und werden über eine adoquery (odbc) mit der datenbank verbunden ...
danke--------
hab nun mal auf dem rechner borland installiert und es nochmal kompiliert nun ist der fehler etwas genauer: ... ist eine Exception der Klasse EAcessViolation aufgetreten, Meldung: 'Zugriffsverketzung bei Adresse ....' in Modul 'ntdll.dll'. Lesen von Adresse FFFFFFFF ....
als warnungen steht noch: 'PID' wurde ein Wert zugewiesen, der nie verwendet wird. warum denn das ?????
-
Las diese Zeile draussen.
frmDB->ADOQuery1->ExecSQL();
Bei select-Statement wird ->Open() benötigt, für alles andere (z.B. Upadte ) ->ExecSQL();
-
Hallo,
was ich jetzt auf die schnelle gesehen habe ist
// SQL an die DB übertragen frmDB->ADOQuery1->ExecSQL(); frmDB->ADOQuery1->Open();
Aus der Hilfe:
Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).also es reicht ein ...->Open();
mfg
VergissEs
-
erstmal danke für denn tipp!!!!
ich hab die ensprechenden stellen geändert aber es funktioniert dennoch nicht!
immernoch die selbe fehlermeldungwas soll ich euch denn posten damit das ganze etwas verständlicher wird ????
ok, um nochmal sicher zu gehen,
bei select immer open verwenden und bei insert, update oder delete immer execsql.cboxPersonal->Clear(); lblInfo->Visible = false; // alte SQL bereinigen frmDB->ADOQuery1->Close(); frmDB->ADOQuery1->SQL->Clear(); // SQL Abfrage erstellen frmDB->ADOQuery1->SQL->Add("SELECT PID, Name, Vorname FROM Personal"); frmDB->ADOQuery1->SQL->Add("WHERE Status = 'on'"); // SQL an die DB übertragen frmDB->ADOQuery1->Open(); int PID; String Name, Vorname; frmDB->ADOQuery1->First(); while(!frmDB->ADOQuery1->Eof) { // Inhalte auswerten und an Combobox übergeben ... PID = frmDB->ADOQuery1->FieldByName("PID")->AsInteger; Name = frmDB->ADOQuery1->FieldByName("Name")->AsString; Vorname = frmDB->ADOQuery1->FieldByName("Vorname")->AsString; cboxPersonal->Items->Add(Name + " - " + Vorname); frmDB->ADOQuery1->Next(); } frmDB->ADOQuery1->Close();
soll ich am schluss überhaupt: frmDB->ADOQuery1->Close(); machen ???
wie gesagt das komische ist das es auf meinem anderen rechner funktioniert!
woran kann das nur liegen ???
-
halt, der fehler kommt nun nichtmehr an der stelle sondern hier:
if(txtName->Text.Length() > 0 && txtVorname->Text.Length()) { int antwort; antwort = Application->MessageBox("Datensatz wirklich löschen ?", "Datensatz löschen", MB_YESNO + MB_ICONQUESTION); if(antwort == 6) // wenn ja angeklickt { // alte SQL bereinigen frmDB->ADOQuery1->Close(); frmDB->ADOQuery1->SQL->Clear(); frmDB->ADOQuery1->SQL->Add("UPDATE Personal"); frmDB->ADOQuery1->SQL->Add("SET Status = 'off'"); frmDB->ADOQuery1->SQL->Add("WHERE PID = :PID"); frmDB->ADOQuery1->Parameters->ParamByName("PID")->Value = StrToInt(txtPID->Text); // SQL an die DB übertragen frmDB->ADOQuery1->ExecSQL(); frmDB->ADOQuery1->Close(); lblInfo->Caption = "Personal '" + txtName->Text + "' erfolgreich gelöscht!"; lblInfo->Visible = true; } }
ist da noch was falsch ????
-
Hallo,
AAAARRRRGGGGGGHHHHHHHH
// SQL an die DB übertragen frmDB->ADOQuery1->ExecSQL(); frmDB->ADOQuery1->Close();
schon wieder das gleiche!!!!!
-
oh shit,
also das close raus?
sprich bei select open und close
und bei anderennur execsql ?
soll ich dann am anfang auchkein:
// alte SQL bereinigen frmDB->ADOQuery1->Close(); frmDB->ADOQuery1->SQL->Clear();
sondern nur clear machen ???
gruß
binary