SQL - Insert via Borland C++ Builder



  • Hallo Zusammen,

    ich habe da ein "kleines" Problem:
    ename, evorname, estrasse, eort, eplz sind Edit-Felder !

    Query1->SQL->Add("Insert into dbo.adresse (Name,Vorname,Strasse,Ort,PLZ) ");
     Query1->SQL->Add(ename->Text + "," + evorname->Text + "," + estrasse->Text + "," + eort->Text + "," + eplz->Text );//+ ";");
     ShowMessage((ename->Text + "," + evorname->Text + "," + estrasse->Text + "," + eort->Text + "," + eplz->Text + ";"));
     Query1->ExecSQL();
    

    Hier bekomme ich folgenden Fehler:

    Allgemeiner SQL-Fehler
    [Microsoft][ODBC SQL Server Driver][SQL Server]Zeile 2: Falsche Syntax in der Nähe von 'testname'.

    (Testname ist der String, welcher im Edit Feld ename eingegeben worden ist.)

    Was mache ich falsch ? 😕



  • Hi,

    du musst die Strings in einfache Anführungszeichen setzen.

    steht in "ename->Text":

    "'testname'" // richtig

    oder
    "testname" // falsch

    Zudem fehlt dir das Schlüsselwort "VALUES".

    Beispiel:

    insert into scheisse( konsistenz, Menge_in_liter)
    values ('dickflüssig',1)
    

    siehe auch: http://www.little-idiot.de/mysql/



  • Ich werde noch zum Hirsch ! 😮

    Query3->Close();
    Query3->SQL->Clear();
    Query3->SQL->Add("Insert into dbo.adresse(Nachname,Vorname,Strasse,Ort,PLZ)");
    

    Jetzt ist die Frage wie bekomme ich aus den Edit-Feldern den Inhalt in die DB ?

    [cpp]

    //schreibt (enachname-Text evorname->Text estrasse->Text eort->Text eplz->Text) rein

    Query3->SQL->Add("values('enachname->Text','evorname->Text','estrasse->Text','eort->Text','eplz->Text')");
    [/cpp]

    //gibt Fehlermeldung: ) Fehlt beim Funktionsaufruf
    Query3->SQL->Add("values("enachname->Text","evorname->Text","estrasse->Text","eort->Text","eplz->Text")");
    

    [cpp]

    //gibt Fehlermeldung: ) Fehlt beim Funktionsaufruf

    Query3->SQL->Add("values("enachname->Text"),("evorname->Text"),("estrasse->Text"),("eort->Text"),("eplz->Text")");
    [/cpp]

    HILFE



  • 😕



  • Query3->SQL->Add("values('"+enachname->Text+"','"+evorname->Text+"','"+estrasse->Text+"','"+eort->Text+"','"+eplz->Text+"')");
    


  • Einfach mal so aus der Hilfe des BCB zu INSERT kopiert:

    Fügt einer Tabelle eine oder mehrere Datenzeilen hinzu.

    INSERT INTO Tabellenreferenz

    [(Spaltenliste)]
    VALUES (Update-Elemente)

    Beschreibung

    Verwenden Sie die Anweisung INSERT, um in eine einzelne Tabelle eine oder mehrere Datenzeilen einzufügen.

    Um die Tabelle anzugeben, die die Daten aufnehmen soll, verwenden Sie in der INTO-Klausel eine Tabellenreferenz.

    Bei der Spaltenliste handelt es sich um eine eingeklammerte und durch Kommas getrennte Liste der Tabellenspalten (optional). Die VALUES-Klausel ist eine durch Kommas getrennte, in Klammern eingeschlossenen Liste von Update-Elementen. Die VALUES-Klausel ist obligatorisch, außer wenn die neuen Zeilen durch eine SELECT-Unterabfrage spezifiziert werden.

    Ist keine Spaltenliste angegeben, so werden eingehende Update-Elemente in den Feldern gespeichert, wie sie sequentiell in der Tabellenstruktur definiert sind. Update-Elemente werden auf die Spalten in der Reihenfolge angewendet, in der sie in der VALUES-Klausel aufgeführt sind. Die Anzahl der Update-Elemente darf geringer, jeinesfalls aber größer sein als die Anzahl der Spalten in der Tabelle.

    INSERT INTO "Holdings.dbf"

    VALUES (4094095, "INPR", 5000, 10.500, "1/2/1998")

    Wenn Sie explizit eine Spaltenliste angegeben haben, werden die eingehenden Update-Werte (in der durch die VALUES-Klausel festgelegten Reihenfolge) in den genannten Spalten gespeichert (und zwar in der durch die Spaltenliste angegebenen Reihenfolge). In den Spalten, die in der Spaltenliste nicht aufgeführt sind, werden NULL-Werte gespeichert. Wenn Sie mit einer expliziten Spaltenliste arbeiten, muß die Anzahl der in der VALUE-Klausel angegebenen Update-Elemente exakt mit der Anzahl der in der Liste angegebenen Spalten übereinstimmen.

    INSERT INTO "Customer.db"

    (CustNo, Company)

    VALUES (9842, "Inprise Corporation")

    Um Zeilen in eine Tabelle einzufügen, die aus einer anderen Tabelle stammen, lassen Sie das Schlüsselwort VALUES weg und benutzen als Quelle für die neuen Zeilen eine Unterabfrage.

    INSERT INTO "Customer.db"

    (CustNo, Company)
    SELECT CustNo, Company

    FROM "OldCustomer.db"

    Das INSERT-Statement unterstützt SELECT-Unterabfragen nur in der VALUES-Klausel. Referenzen auf andere Tabellen als diejenige, in die neue Zeilen eingefügt werden, oder auf Spalten anderer Tabellen sind nur in SELECT-Unterabfragen möglich.

    Was an dieser Erklärung verstehts Du nicht?



  • Mike_2004 schrieb:

    Hallo Zusammen,

    ich habe da ein "kleines" Problem:
    ename, evorname, estrasse, eort, eplz sind Edit-Felder !

    Query1->SQL->Add("Insert into dbo.adresse (Name,Vorname,Strasse,Ort,PLZ) ");
     Query1->SQL->Add(ename->Text + "," + evorname->Text + "," + estrasse->Text + "," + eort->Text + "," + eplz->Text );//+ ";");
     ShowMessage((ename->Text + "," + evorname->Text + "," + estrasse->Text + "," + eort->Text + "," + eplz->Text + ";"));
     Query1->ExecSQL();
    

    Hier bekomme ich folgenden Fehler:

    Allgemeiner SQL-Fehler
    [Microsoft][ODBC SQL Server Driver][SQL Server]Zeile 2: Falsche Syntax in der Nähe von 'testname'.

    (Testname ist der String, welcher im Edit Feld ename eingegeben worden ist.)

    Was mache ich falsch ? 😕

    bücher lesen



  • @Burkhi - Vielen Dank, nun funktioniert es !

    @123 - In welchen Bücher vom BCB werden vernüftige Beispiele zu SQL gegeben ?
    Ich habe in keinem Buch (Insert, Update, Delete gefunden, wenn dann Select).

    @Joe_M- (Danke für die Hilfe und sehe das bitte nicht als Angriff...aber=)
    Sicherlich verstehe ich das so, allerdings würde ich das so nie in einer SQL-Anweisung schreiben:

    Query3->Close();
      Query3->SQL->Clear();
      Query3->SQL->Add("Insert into dbo.adresse(Nachname,Vorname,Strasse,Ort,PLZ)");
      Query3->SQL->Add("values('"+enachname->Text+"','"+evorname->Text+"','"+estrasse->Text+"','"+eort->Text+"','"+eplz->Text+"')");
      Query3->ExecSQL();
    

    Sondern:

    INSERT INTO Adresse(Name,Vorname,Strasse,Ort,PLZ)
    VALUES('Mustermann','Markus','Musterstrasse 3','Musterdorf','22222');
    


  • Mike_2004 schrieb:

    In welchen Bücher vom BCB werden vernüftige Beispiele zu SQL gegeben?

    SQL hat primär zunächst mal nichts mit dem BCB zu tun und eine Query-Komponente verwendest Du nur, um einen SQL-Befehl (als String) an die DB zu
    senden. Und zu SQL findest Du sicherlich pfundweise Bücher.

    Gruß,

    Alexander


  • Mod

    Hallo

    zB
    C++ Builder Datenbankprogrammiereung ISBN 3-8273-1295-7
    Delphi 6 Datenbankprogrammierung ISBN 3-8273-1785-1
    ...
    ...

    MfG
    Klaus



  • Und damit man die Anführungszeichen nicht immer von Hand tippseln muß, wurde die Funktion QuotedStr() 'erfunden'...



  • Joe_M. schrieb:

    Und damit man die Anführungszeichen nicht immer von Hand tippseln muß, wurde die Funktion QuotedStr() 'erfunden'...

    Naja... wers braucht... 🙄 Ob nun Funktionsaufruf oder Stringaddition, ist doch auch egal...



  • Nun ja, ich finde es übersichtlicher und praktischer QuotedStr zu verwenden. Ich kann auf jeden Fall schneller + QuotedStr(irgendwas) + tippen als + "'" + irgendwas + "'", oder gar + "\"" + irgendwas + "\"". 😉



  • Na fein... einigen wir uns auf die Schublade "Geschmackssache"? 😃



  • deswegen ja: ich finde es 🤡



  • Ich kann ja manchmal meinen Mund nicht halten 😉
    Da AnsiString, im Gegensatz zu String in Pascal, kein Datentyp ist sondern eine Klasse stellt sich für mich die Frage, was ist schneller. In diesem Fall eine String Addition oder die Anwendung von QuotedString wobei die Funktion gerade bei SQL Vorteile bringt, da automatisch vorhandene "'" verdoppelt werden. Wer Interesse hat kann das ja mal mit folgendem kleinen Progämmchen ausprobieren

    int x;
    AnsiString str1, str2;
    
    ListBox1->Items->Add(Now().FormatString("HH:NN:SS"));
    for(x=0; x<5000000; x++)
    {	str1="Hallo Leute";
    	str2=QuotedStr(str1);
    }
    ListBox1->Items->Add(Now().FormatString("HH:NN:SS"));
    for(x=0; x<5000000; x++)
    {	str1="Hallo Leute";
    	str2="'"+str1+"'";
    }
    ListBox1->Items->Add(Now().FormatString("HH:NN:SS"));
    


  • Hmm... komisches Ergebnis irgendwie. Warum? Ich hätte schon gedacht, dass QuotedString viel länger dauert... wenn da auch noch vorhandene " abgefangen werden..


Anmelden zum Antworten