"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

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Code: Alles auswählen

SqlQuery.Close;
SqlQuery.SQL.Clear;
SqlQuery.SQL.Add('INSERT INTO SNSerienNr ');
SqlQuery.SQL.Add('(IdentNr, SerienNr, Zusatz, EtikettTyp, Text1, Text2, Text3, Bem) ');
SqlQuery.SQL.Add('VALUES (:IDNR, :SERNR, :ZUSATZ, :TYP, :TEXT1, :TEXT2, :TEXT3, :BEM) ');
SqlQuery.Params.ParamByName('IDNR').AsString := 'AAA';
SqlQuery.Params.ParamByName('SERNR').AsInteger := 1;
SqlQuery.Params.ParamByName('ZUSATZ').AsString := 'X';
SqlQuery.Params.ParamByName('TYP').AsString := 'BBB';
SqlQuery.Params.ParamByName('TEXT1').AsString := 'A';
SqlQuery.Params.ParamByName('TEXT2').AsString := 'B';
SqlQuery.Params.ParamByName('TEXT3').AsString := 'C';
SqlQuery.Params.ParamByName('BEM').AsString := 'XX';
 
SqlQuery.ExecSQL;
SqlTransaction.Commit;
Ok, jetzt mal mit allen Feldern!
Wenn ich "ID" einen Wert zuweisen will bekomme ich eine klare Fehlermeldung daß das bei diesem Feldtyp nicht sein darf,
ebenso bei Tippfehlern, da kommt dann eben die entprechende Meldung daß der Bezeichner nicht bekannt ist.

Die Tabelle als solches funktioniert seit Jahren mit einer Delphi-Anwendung,
ich kann aber auch per Access oder sonstigem da Datensätze bearbeiten und einfügen,
kann also schon abschätzen welche Felder gebraucht werden und welche nicht.

Die "Voraussetzungen im Hintergrund" versuchte ich ja damit abzudecken, ein möglichst einfaches funktionierendes Beispiel abzubilden,
jedoch konnte ich bei keinem der bisher vorgeschlagenen Muster erfolgreich einen Datensatz schreiben und die Fehlermeldung ist relativ nichtssagend.

Könnte mir vielleicht jemand mal eine komplettes funktionierendes Testprojekt,
nur bestehend aus ODBCConnection + SQLTransaction + SQLQuery + Datasource zukommen lassen
bei der nur ein Datensatz in eine ODBC-Datenbank geschrieben wird?

Ich glaube das wär die einzige Möglichkeit abzukären ob es sich hier um einen prinzipiellen Fehler handelt oder nicht.

Danke schon mal im Voraus
eiko

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. »

Ich glaube MySQL ist da etwas anders, aber bei meinen Inserts gebe ich für die ID-Spalte (auto increment, Not Null) immer 'NULL' als Eingabestring mit an. Ich verwende keinen extra Trigger.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: "Insert" in MSSQL-DB

Beitrag von theo »

Ich habe keine Ahnung von MSSQL, aber ich würde mal versuchen einzugrenzen, woran es liegen könnte.

Dazu würde ich z.B. mal mit dem gleichen Code eine MySQL Datenbank befehligen. Einfach mal sehen ob die auch spukt.
Nächste Idee: MSSQL über Zeos testen.
Kann ja sein, dass "unterwegs" ein Licht aufgeht.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: "Insert" in MSSQL-DB

Beitrag von Socke »

Thomas B. hat geschrieben:Ich glaube MySQL ist da etwas anders, aber bei meinen Inserts gebe ich für die ID-Spalte (auto increment, Not Null) immer 'NULL' als Eingabestring mit an. Ich verwende keinen extra Trigger.
Wenn die Datenbank-Engine einen solchen Datentyp besitzt, ist das auch der übliche Weg. Entsprechende Typen gibt es in praktisch jeder nicht trivialen Engine (MS Jet, MS SQL Server, MySQL, SQLite, etc.). Trigger sind da eher ein Umweg, denn alles, was ein Trigger kann, kann auch eine Client-Anwendung (auch wenn auf andere Art und Weise).
eiko hat geschrieben:Könnte mir vielleicht jemand mal eine komplettes funktionierendes Testprojekt,
nur bestehend aus ODBCConnection + SQLTransaction + SQLQuery + Datasource zukommen lassen
bei der nur ein Datensatz in eine ODBC-Datenbank geschrieben wird?
Hast du einmal versucht das SQL Server Native Interface zu verwenden? Damit kannst du zumindest eine korrekte Verbindung zum Server feststellen.
eiko hat geschrieben:Die "Voraussetzungen im Hintergrund" versuchte ich ja damit abzudecken, ein möglichst einfaches funktionierendes Beispiel abzubilden,
jedoch konnte ich bei keinem der bisher vorgeschlagenen Muster erfolgreich einen Datensatz schreiben und die Fehlermeldung ist relativ nichtssagend.
Die Fehlermeldungen sind aussagekräftiger als du denkst; man muss die nur lesen und verstehen, was damit gemeint ist. Da kann ein wenig Datenbanktheorie helfen. In der Praxis ist google auch aussagekräftig.
Ich zitiere die von dir zuletzt gepostete Fehlermeldung (Screenshot):

Code: Alles auswählen

Could not execute statement. 
ODBC error details: 
 
LastReturnCode: SQL_ERROR; 
 
Record 1: 
SqlState: 22001; 
Native Error: 8152; 
Message: [Microsoft][ODBC SQL Server Driver][SQL Server]
Zeichenfolgen- oder Binärdaten werden abgeschnitten.; 
 
Record 2: 
SqlState: 01000; 
NativeError: 3621; 
Message: [Microsoft][ODBC SQL Server Driver][SQL Server]
Die Anweisung wurde beendet.;.
Daraus ergibt sich:
  • Fehlercode(s) des SQL-Servers
  • Fehlerbeschreibung(en); diese erscheint durch die Übersetzung ins Deutsche manchmal ein wenig unüblich. Bsp: "SQL Statment" ist eine "Anweisung"
  • Spätestens jetzt sollte klar sein, dass du zwei Fehler erhalten hast, die in Abhängigkeit stehen können
  • Für Fehlercode 8152 gibt es z.B. hier eine Beschreibung: www.sql-server-helper.com
Als mögliche Ursachen fällt mir da ein:
  • Falscher Datentyp in den Komponenten eingestellt
  • Die Datentypen werden zur ODBC-Schnittstelle falsch übergeben
  • andere Fehler
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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 »

Verwendest du ein 64-Bit-System?
Dann liegt das am falschen ODBC-Treiber.
Was bei 32-Bit problemlos funktioniert, klappt bei 64 Bit nicht, da die definition des Typs Integer nicht passt.
Dieses Problem haben ODBC-Treiber zuweilen. Die Lösung ist, den korrekten ODBC-Treiber zu installieren.

Wobei mir ohnehin nicht klar wird, warum man unbedingt mit ODBC arbeiten will. Das mit dem Commit() kannst du dir
auch sparen, das die ODBCConnection Transaktionen (noch) nicht unterstützt. Zumindest noch nicht, als ich mir den
Quellcode von Lazarus 0.9.30 dafür angeschaut habe.
Grüße, Antrepolit

care only if your os is really burning

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: "Insert" in MSSQL-DB

Beitrag von Christian »

Zeos kann unter WIndows direkt mit MSSL umgehn, seit Jahren im Einsatz und funktioniert top.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: "Insert" in MSSQL-DB

Beitrag von eiko »

Christian hat geschrieben:Zeos kann unter WIndows direkt mit MSSL umgehn, seit Jahren im Einsatz und funktioniert top.
So Jungs,
erstmal entschuldigt daß ich mich so lange nicht mehr gemeldet hab!

Hab mir den Tip mit ZEOS zu Herzen genommen und es nach einigen mühsamen Installations-Versuchen auch zum laufen gebracht.

Ergebnis: Sieht sehr gut aus! Werd da definitiv weiter damit arbeiten!

Ohne eure Hilfe wär ich aber vermutlich nicht drauf gestoßen und ich war schon kurz davor Lazarus hinzuschmeißen!

Darum Danke für eure Mühe!


Grüße eiko

Antworten