Firebird + TIBQuery + überprüfen ob Eintrag bereits exsistiert = Fehler



  • ja tritt leider auch auf...

    habe das EOF durch Form1->Query1->RecordCount == 0 ersetzt...

    ich weiß nicht obs von belang ist aber in der if schleife passiert mti dme Query folgendes:

    Form1->Query1->SQL->Add("insert into Data(interpret,album,titel,kommentar,Adress) values(:interpret,:album,:titel,:kommentar,:Adress)");
                                            Form1->Query1->ParamByName("interpret")->Value = Data.interpret.c_str();
                                            Form1->Query1->ParamByName("album")->Value = Data.album.c_str();
                                            Form1->Query1->ParamByName("titel")->Value = Data.titel.c_str();
                                            Form1->Query1->ParamByName("kommentar")->Value = Data.kommentar.c_str();
                                            Form1->Query1->ParamByName("Adress")->Value = (*i).c_str();
                                            Form1->Query1->ExecSQL();
                                            Form1->IBTransaction1->CommitRetaining();
    


  • Hallo,
    in Deiner if-Anweisung steht nur ein Query1->Add. Du solltest es so wie vor Deiner if-Anweisung machen. Also, Close, Clear, Add....

    Vielleicht hilft es ja.....



  • ist da auch habe ich nur nicht zititert ... da ist auch query close und query->sql->clear...

    aber es hängt sich irgendwie auf... ich habe auch schon mal versucht das ganze auszugleidern geht auch nicht 😞



  • Wahrscheinlich enthält der Text, den du einfügen willst, irgendwelche Sonderzeichen.
    Möglicherweise hilft es, mit Parametern zu arbeiten, siehe TCustomSQLDataSet::Params.



  • Es hat nichts mit dem add zu tun...

    ich habe mal die testroutine ausgegliedert :

    vector<std::string>::const_iterator i;
            for (i = mp3.begin(); i != mp3.end(); ++i)
            {
                    AnsiString SQLi = (*i).c_str();
    
                    /*while(SQLi.Length() < (Adresslenght ))//string auf feldlänge bringen
                    {
                            SQLi+= ' ';
                    } */
    
                    Edit1->Text = "Test if deja exist";
                    Form1->Query1->Close();
                    Form1->Query1->SQL->Clear();
                    Form1->Query1->SQL->Add("SELECT Adress FROM DATA WHERE Adress = '" + SQLi +"'");
                    Form1->Query1->Open();
                    if(Form1->Query1->RecordCount > 0)//true)
                    {
    
                    }
            }
    

    hier tritt der fehler auch auf



  • Vielen Dank für das Gespräch.



  • Hallo,

    ich kann Dir zwar auf anhieb auch nicht sagen warum der Fehler auftritt, aber ich denke der Lösungsansatz an sich ist ungünstig.
    Falls Du TIBQuery benutzen willst, solltest Du zwei Instanzen von TIBQuery erzeugen. Eine zum Suchen und eine zum Einfügen. Beide sollten Parametrisiert sein.
    z.B

    FROM DATA WHERE Adress = :Adress
    

    In jedem Schleifendurchlauf muss dann mit

    ->ParamByName("Adress")->AsString = SQLi;
    

    die gesuchte Adresse zugewiesen werden. Nach jedem Einfügen muß die äussere Abfrage noch commited werden.

    Aber am aller besten würdest Du TIBDataset einsetzen 👍 und die Funktion locate benutzen, um einen bestimmten Datensatz zu finden und zu ändern.



  • Hallo,
    mir ist da doch noch etwas eingefallen. Und zwar unterscheidet ein Query zwischen Open und ExcecSQL!
    Was jetzt wann richtig ist, weis ich nicht mehr. Aber probier es doch mal mit Query1->ExcecSQL



  • Hallo

    Was Open und ExecSQL unterscheidet, steht in der BCB-Hilfe zu den beiden Methoden.
    Um es kurz zu machen : im gegebenen Fall hier ist das Open richtig.

    bis bald
    akari



  • Jansen schrieb:

    Wahrscheinlich enthält der Text, den du einfügen willst, irgendwelche Sonderzeichen.
    Möglicherweise hilft es, mit Parametern zu arbeiten, siehe TCustomSQLDataSet::Params.

    Omg... jetzt raf ich erst was du meinst

    Sowas oder?

    Edit1->Text = "Test if deja exist";
                    Form1->Query1->Close();
                    Form1->Query1->SQL->Clear();
                    Form1->Query1->SQL->Add("SELECT Adress FROM DATA WHERE Adress = 'MeineAdresse' values(:MeineAdresse)");//" + SQLi +"'");
                    Form1->Query1->ParamByName("MeineAdresse")->Value = SQLi;
                    Form1->Query1->Open();
                    if(Form1->Query1->RecordCount > 0)//true)
                    {
    
                    }
    

    Stimmt das so soweit?

    weil ich bekomme einen anderen Fehler, der für mich auf einen fehler hinweist

    Project Project1.exe raised exveption class EIBInterBaseError with message 'Dynamic SQL Error
    SQL error code= -104
    Token unknown -line1, char 55
    values'. Process stoped.



  • Nö, nicht so ganz.

    Form1->Query1->SQL->Add("SELECT Adress FROM DATA WHERE Adress = :MeineAdresse");
    

    Grüße Joe_M.



  • vielen dank... jetzt geht alles einwandfrei 🙂


Anmelden zum Antworten