"Insert" in MSSQL-DB

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

"Insert" in MSSQL-DB

Beitrag von eiko »

Hallo,
versuche seit Tagen erfolglos über eine TSqlQuery-Komponente einen neuen Datensatz in eine MSSQL-Datenbank einzufügen,
"Select" und "Update" funktionieren problemlos, nur "Insert" will nicht klappen!

Hätte hier vielleicht jemand mal ein funktionierendes Beispiel für ein "Insert",
wäre für etwas Nachhilfe sehr Dankbar!


Grüße eiko

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: "Insert" in MSSQL-DB

Beitrag von DiBo33 »

Wie sieht/sehen denn dein(e) Versuch(e) aus?

Was funktioniert nicht, welche Fehlermeldungen bekommst du?

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Hallo,
danke schonmal vorab für deine Unterstützung!
Meine Versuche sehen so aus:

Code: Alles auswählen

SqlQueryQuery.Close;
SqlQueryQuery.InsertSQL.Clear;
SqlQueryQuery.InsertSQL.ADD('INSERT INTO Tabelle ');
SqlQueryQuery.InsertSQL.ADD('(Feld1, Feld2, Feld3) ');
SqlQueryQuery.InsertSQL.ADD('VALUES (''AAA'', 1, 'BBB'') ');
SqlQueryQuery.Open;
 
SqlQueryQuery.Insert;
SqlQueryQuery.Post;
SqlQueryQuery.ApplyUpdates;
Es läuft auch alles sowaeit fehlerlos durch,
erst bei "ApplyUpdates" kommt als Fehler:
Dateianhänge
ODBC-Fehler.jpg
Zuletzt geändert von Lori am Mo 26. Mär 2012, 18:04, insgesamt 1-mal geändert.
Grund: Bitte richtigen Highlighter nehmen

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: "Insert" in MSSQL-DB

Beitrag von Thomas B. »

Ah, der klassische Fehler:
für Abfragen "Open", aber für Updates,Inserts etc. immer SQLQuery.ExecSQL

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Wenn ich aber statt "Open" dann "ExecSQL" ausführe bekomme ich als Fehler:
"Operation cannot be performed on an inactive Dataset"

Gebs zu, bin etwas ratlos!

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: "Insert" in MSSQL-DB

Beitrag von DiBo33 »

Versuchs mal mit parametrisierte Abfragen, Beispiel für Insert am Ende.
http://wiki.lazarus.freepascal.org/Work ... Parameters" onclick="window.open(this.href);return false;

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

So, neuer Stand!

Code: Alles auswählen

SqlQuery.Close;
SqlQuery.InsertSQL.Clear;
SqlQuery.InsertSQL.Add('INSERT INTO Tabelle ');
SqlQuery.InsertSQL.Add('(Feld1 Feld2, Feld2) ');
SqlQuery.InsertSQL.Add('VALUES (:FLD1, :FLD2, :FLD3) ');
 
SqlQuery.Params.ParamByName('FLD1').AsString := 'AAA';
SqlQuery.Params.ParamByName('FLD2').AsInteger := 1;
SqlQuery.Params.ParamByName('FLD3').AsString := 'BBB';
SqlQuery.ExecSQL;
 
SqlTransaction.Commit;
Bekomme dann leider nur die Fehlermeldung:
"Paramater "FLD1" not found!

Hab auch versuchsweise mal FLD1 in SqlNrQuery.Parameters von Hand angelegt,
aber auch dann kommt die gleiche Fehlermeldung.

Noch jemand Ideen?


Grüße eiko

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: "Insert" in MSSQL-DB

Beitrag von DiBo33 »

Nimm mal nicht insertSQL sondern tatsächlich wie im Beispiel SqlQuery.Text und SqlQuery.ExecSQL;

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Code: Alles auswählen

SqlQuery.Close;
SqlQuery.SQL.Clear;
SqlQuery.SQL.Text := 'INSERT INTO Tabelle (Feld1 Feld2, Feld2) VALUES (:FLD1, :FLD2, :FLD3)';  
 
SqlQuery.Params.ParamByName('FLD1').AsString := 'AAA';
SqlQuery.Params.ParamByName('FLD2').AsInteger := 1;
SqlQuery.Params.ParamByName('FLD3').AsString := 'BBB';
SqlQuery.ExecSQL;
 
SqlTransaction.Commit;
ergibt:
Dateianhänge
ODBC-Fehler.jpg

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: "Insert" in MSSQL-DB

Beitrag von DiBo33 »

"Zeichenfolge oder Binärdaten werden abgeschnitten"

Wie sieht denn die Tabellendefinition aus?

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

So sieht das Original aus:
Dateianhänge
Tabelle.jpg

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: "Insert" in MSSQL-DB

Beitrag von Thomas B. »

Fehlt ein Komma zwischen Feld1 und Feld2 bzw. Feld2 doppelt?
Schon mal mit

Code: Alles auswählen

INSERT INTO Tabelle (Feld1,Feld2,Feld3) VALUES ('AAA',1,'BBB')
probiert, ob es prinzipiell klappt?

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: "Insert" in MSSQL-DB

Beitrag von Antrepolit »

Du musst beim Insert den Not-Null-Feldern Werte zufügen. Das ist obligatorisch. Und wo bitte heißen denn in der Tabelle Felder "Feld1", "Feld2" etc.?
Grüße, Antrepolit

care only if your os is really burning

eiko
Beiträge: 13
Registriert: Mo 26. Mär 2012, 11:02

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Antrepolit hat geschrieben:Du musst beim Insert den Not-Null-Feldern Werte zufügen. Das ist obligatorisch. Und wo bitte heißen denn in der Tabelle Felder "Feld1", "Feld2" etc.?
Tschuldigung daß ich nicht gleich alle Firmendetails preisgegeben hab!
Das Not-Null-Feld "ID" ist ein sich automatisch selber hochzählendes Feld, da darf ich keinen Wert angeben
und das Feld "Zusatz" hat als Standardwert "".

Hier dann also das Original!

Code: Alles auswählen

SqlQuery.SQL.Text := 'INSERT INTO SNSerienNr (IdentNr, SerienNr, EtikettTyp) VALUES (:IDNR, :SERNR, :TYP)';
 
SqlQuery.Params.ParamByName('IDNR').AsString := 'AAA';
SqlQuery.Params.ParamByName('SERNR').AsInteger := 1;
SqlQuery.Params.ParamByName('TYP').AsString := 'BBB';
SqlQuery.ExecSQL;
 
SqlTransaction.Commit;
Aber scheinbar ist es wirklich so daß niemand ein funktionierendes Beispiel einer INSERT-Funktion hat!
Schade!

Grüße eiko

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: "Insert" in MSSQL-DB

Beitrag von knight »

Grundsätzlich funktioniert dieses Beispiel. Es müssen aber auch die Voraussetzungen im 'Hintergrund' gegeben sein. Dazu gehört, daß allen Feldern mit NOT NULL ein Wert zugewiesen wird. Wenn wie in deinem Beispiel ein Feld (ID) automatisch von der Datenbank belegt werden soll, dann verwendet man dafür üblicherweise Trigger (z.B. einen Before-Insert-Trigger). Möglicherweise ist dir irgendwo ein Tippfehler unterlaufen, der die korrekte Zuordnung verhindert und so zu einem Fehler führt.

knight

Antworten