C++ Access insert Problem. [erledigt]



  • hallo,
    wenn ich versuche in access db was zu schreiben und ein Feld (Edit.)
    leer ist kommt:
    "...Exception der Klasse EOleException mit der Meldung 'Datentypen in Kriterienausdruck unverträglich' aufgetreten."

    ADOQuery1->SQL->Add("insert into info (lfd_nr,bezeichnung,einheit,hersteller)"
     "values (:lfd_nr,:bezeichnung,:einheit,:hersteller);");
    
     ADOQuery1->Parameters->ParamByName("lfd_nr")->Value = Edit2->Text;
     ADOQuery1->Parameters->ParamByName("bezeichnung")->Value = Edit3->Text;
     ADOQuery1->Parameters->ParamByName("einheit")->Value = ComboBox1->Text;
     ADOQuery1->Parameters->ParamByName("hersteller")->Value = ComboBox2->Text;
    
     ADOQuery1->ExecSQL();
    

    Wenn ich zum Beispiel bezeichnung einfach leer lasse.
    Wo und wie kann man das Problem lösen???

    Dank im Voraus.



  • welche Feld versuchst du denn leer zu lassen? hat das vielleicht nen Index oder ist Primärschlüssel?

    hier mal eine Möglichkeit (falls NULL also ein leerer Feldinhalt erlaubt ist)

    Variant Leer; 
    Leer.Clear();
    ADOQuery1->SQL->Add("insert into info (lfd_nr,bezeichnung,einheit,hersteller)"
     "values (:lfd_nr,:bezeichnung,:einheit,:hersteller);");
    
    ADOQuery1->Parameters->ParamByName("lfd_nr")->Value = Edit2->Text;
    if (Edit3->Text.Trim() == "")
    		ADOQuery1->Parameters->ParamByName("bezeichnung")->Value = Leer;
    else
    		ADOQuery1->Parameters->ParamByName("bezeichnung")->Value = Edit3->Text;
    ADOQuery1->Parameters->ParamByName("einheit")->Value = ComboBox1->Text;
    ADOQuery1->Parameters->ParamByName("hersteller")->Value = ComboBox2->Text;
    
    ADOQuery1->ExecSQL();
    

    ist lfd_nr wirklich ein String? oder ist das autoinc?



  • hi,
    lfd_nr ist kein Primärschlüssel, ist ein String.
    Es sind mehr Spalten vorhanden als ich das da geschrieben habe.
    Nur das kein nicht sein, das man kein leeren feld schreiben kann.

    Also
    Edit1->Text oder Edit2 oder Edit3 etc... kann ja je nachdem leer sein.
    Ich muss das doch nicht immer überprüfen????

    Das hat auch mit Mysql und dbexpress geklappt!
    Oder liegt das an access ???



  • In Access kannst du definieren ob ein Feld leer sein darf, villeicht ist dieses Feld so ein gestellet das es nicht leer sein darf.
    Legst du die Tabellen mit dem Builder an oder mit Access?



  • Problem gelöst habe den Fehler gefunden.
    Danke für die Hilfe.



  • und was war der Fehler? wär ja schön zu wissen für die die ein ähnliches Problem haben 😉



  • Also ich weiß es nicht warum das Problem so gelöst ist.

    Aber wenn man ein ADOConnection1 hat und eine Verbindung zum Datenbank -
    und man hat eine ADOQuery1, muss man bei beiden also auch bei ADOQuery1->Connected = true setzen.

    Bei dbExpress müsste man nur TSQLConnection auf true setzen und das hat funktioniert.

    Also wie gesgat ich verstehe das nicht, aber jetzt geht es wo ich beides auf true gesetzt habe.



  • Das liegt wohl daran, dass bei eine TADOQuery verschiedene Ausführungsmöglichkeiten zur Verfügung stehen (Open -> mit Ergebnismenge, Execute -> ohne Ergebnismenge). Du solltest auch nicht Connected einfach auf true setzen (und dich darauf verlasse, dass das richtige passiert), sonder Open und Close verwenden.


Anmelden zum Antworten