![]() |
Datenbank: Access • Version: JET 4.0 • Zugriff über: ADO + SQL
SQL Syntax Error? Was ist falsch?
HI! Ich habe eine Datenbank die ich mit hilfe von Records auslese. Nun möchte ich diese Datensatz für Datensatz in eine Access-DB mittels ADO und SQL übertragen. Aber ich bekomme immer wieder eine SQL Syntax Error Message und weiß nicht woran es liegen könnte...
Delphi-Quellcode:
Bitte helft mir, ich komme hier einfach nicht weiter :wall:
type
TARDRecord = packed record ID: array[1..13] of Char; Anrede: array[1..13] of Char; Art: array[1..13] of Char; Kunde: array[1..61] of Char; Name: array[1..87] of Char; Strasse: array[1..61] of Char; PLZ: array[1..10] of Char; Ort: array[1..41] of Char; Tel: array[1..21] of Char; Mobil: array[1..21] of Char; Buffer: array[1..102] of Char; Datum: array[1..16] of Char; Preis: array[1..16] of Char; Feld1: array[1..1] of Char; Feld2: array[1..6] of Char; Anzahl: array[1..6] of Char; Feld3: array[1..61] of Char; Feld4: array[1..61] of Char; end; ... function TEDM.SyncData: Boolean; var SQL: String; begin SyncData := TRUE; AssignFile(ARDFile, 'D:\EvilBird\Kunden.ard'); Reset(ARDFile); while not Eof(ARDFile) do begin try Clients.Close; Clients.SQL.Clear; Clients.SQL.Add('INSERT INTO Clients ( ID, ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone) VALUES ( '''', ''' + ARDRecord.ID + ''', ''' + ARDRecord.Name + ''', ''' + ARDRecord.Strasse + ''', ''' + ARDRecord.PLZ + ''', ''' + ARDRecord.Ort + ''', ''' + ARDRecord.Tel + ''', ''' + ARDRecord.Mobil + ''' );'); Clients.ExecSQL; except SyncData := FALSE; end; end; CloseFile(ARDFile); end; |
Re: SQL Syntax Error? Was ist falsch?
1, Welche Fehlermeldung
2, Welche Werte haben deine Strings 3, Arbeite lieber mit Parametrisierten Abfragen. Ich vermute mal das irgeneiner deiner Daten eine Hochkomma beinhaltet und damit keine gültige SQL-Anweisung mehr darstellt. |
Re: SQL Syntax Error? Was ist falsch?
Hallo,
evtl. liegt es an den Anführungszeichen. Access erwartet für Text-Felder doppelte Anführungszeichen. Ausserdem scheint Deine Parameteranzahl nicht zu stimmen (es fehlt die Anrede)! Folgendes sollte funktionieren:
Delphi-Quellcode:
var aQry:String;
... aQry:='INSERT INTO Clients'+#13#10+ '(ID, ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone)'+#13#10+ 'VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")'; ... Clients.Close; with ARDRecord do Clients.SQL.Text:=Format(aQry, ['', ID, Anrede, Name, Strasse, PLZ, Ort, Tel, Mobil]); Clients.ExecSQL; ... |
Re: SQL Syntax Error? Was ist falsch?
1. "Syntax error in string in query expression ''''! "
2. Keine Ahnung, da ich bis jetzt noch nicht alle 1500 Datensätze gesehen hab. 3. Hab ich schon probiert aber habs nicht hinbekommen, also wie? codein |
Re: SQL Syntax Error? Was ist falsch?
Hi Gollum!
Thx für dienen Vorschlag... Ich bekomme jetzt aber das hier
Delphi-Quellcode:
:cry: Das schlimme ist, ich kann damit nichts anfangen... :gruebel:
[Error] EDMUnit.pas(351): Bad argument type in variable type array constructor
|
Re: SQL Syntax Error? Was ist falsch?
Hallo,
hast Du mal meine Version ausprobiert? Das selbe Spielchen aber diesmal mit Parameter:
Delphi-Quellcode:
Edit:
aQry:='INSERT INTO Clients'+#13#10+
'(ID, ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone)'+#13#10+ 'VALUES (:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9)'; ... with Clients, ARDRecord do begin Close; SQL.Text:=aQry; ParamByName('p1').AsString:=''; ParamByName('p2').AsString:=ID; ParamByName('p3').AsString:=Anrede; ... ... ParamByName('p9').AsString:=Mobil; ExecSQL; end; // with ... Irgendwie habe ich das Gefühl, es liegt an dem ominösen Feld ID. Was für ein Typ ist dieses Feld in der Access-DB? Ein AutoIncrement-Feld? Wenn ja, dann kannst Du es beim Einfügen weglassen!! Edit2: Es kann aber auch daran liegen, dass das Statement mit deiner Array of Char-Deklaration nicht zurechtkommt. Evtl. hilft es, wenn Du die Chars mit StrPas(Recordfeld) in einen Delphi-String konvertierst. |
Re: SQL Syntax Error? Was ist falsch?
ja deine Version ist die die mir diese Fehlermeldung produziert hat. Ich werd jetzt auch mal die andere ausprobieren. Das Feld ID in der Access-DB ist ein AutoIncrement-Feld. ARDRecord.ID ist jedoch hingegen eine Kundennummer like 10537.
Wie soll ich denn das mit dem DelphiString machen? Ich hab keine Ahnung wie du das meinst... codein |
Re: SQL Syntax Error? Was ist falsch?
Hallo,
der Inhalt eins Autoinkremtet-Feld wird automatisch durch die Datenbank (sags einfach mal so) gesetzt, d.h. wenn Du versuchst dort was reinzuschreiben, dann gibts eine Fehlermeldung. Ich mache es normalerweise so Client.SQL.Text := 'xxxx' Dann kann ich im Debugger vor dem Aufruf von EXECSQL nachschauen, wie denn genau mein SQL Befehl aussieht und kann somit den Fehler relativ einfach finden. Grüße Sven |
Re: SQL Syntax Error? Was ist falsch?
Hallo,
Zitat:
Wenn jetzt folgendes nicht funktioniert, dann weiß ich auch nicht mehr weiter:
Delphi-Quellcode:
aQry:='INSERT INTO Clients'+#13#10+
'(ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone)'+#13#10+ 'VALUES (:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8)'; ... with Clients, ARDRecord do begin Close; SQL.Text:=aQry; ParamByName('p1').AsString:=ID; // evtl. ParamByName('p1').AsString:=StrPas(ID); ParamByName('p2').AsString:=Anrede; ... ... ParamByName('p8').AsString:=Mobil; ExecSQL; end; // with ... |
Re: SQL Syntax Error? Was ist falsch?
OK sie schaut jetzt so aus:
Delphi-Quellcode:
Das Problem ist jetzt bekomme ich diese Fehlermeldung:
function TEDM.SyncData: Boolean;
var SQL: String; Qry:String; begin SyncData := TRUE; AssignFile(ARDFile, 'D:\EvilBird\Kunden.ard'); Reset(ARDFile); while not Eof(ARDFile) do begin try Qry:='INSERT INTO Clients'+#13#10+ '(ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone)'+#13#10+ 'VALUES (:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8)'; with Clients, ARDRecord do begin Close; SQL.Text:=Qry; Parameters.ParamByName('p1').Value:=StrPas(ID); Parameters.ParamByName('p2').Value:=StrPas(Anrede); Parameters.ParamByName('p3').Value:=StrPas(Name); Parameters.ParamByName('p4').Value:=StrPas(Strasse); Parameters.ParamByName('p5').Value:=StrPas(PLZ); Parameters.ParamByName('p6').Value:=StrPas(Ort); Parameters.ParamByName('p7').Value:=StrPas(Tel); Parameters.ParamByName('p8').Value:=StrPas(Mobil); ExecSQL; end; except SyncData := FALSE; end; end; CloseFile(ARDFile); end; [Error] EDMUnit.pas(354): Incompatible types: 'Array' and 'PAnsiChar' Wenn ich die Funktion StrPas(Record) weglasse bekomme ich diese: [Error] EDMUnit.pas(354): Incompatible types: 'Variant' and 'Array' :roll: Hast du da noch eine Idee? |
Re: SQL Syntax Error? Was ist falsch?
Hallo,
das einzige was mit jetzt noch einfällt ist, dass Probleme mit dem Feld Name bestehen. Da die ADOQuery auch eine Eigenschaft gleichen Namens besitzt, kann es zu Namenskonflikten kommen. Hilft folgendes:
Delphi-Quellcode:
...
Parameters.ParamByName('p3').Value:=StrPas(ARDRecord.Name); ... |
Re: SQL Syntax Error? Was ist falsch?
Liste der Anhänge anzeigen (Anzahl: 1)
aber die beiden fehler treten doch schon hier auf (beim debuggen).
Hier schau mal... |
Re: SQL Syntax Error? Was ist falsch?
Hallo,
in Deinem Postin schreibts Du, Du hättest es jetzt so gemacht:
Delphi-Quellcode:
In Deiner Debug-Übersicht sieht der Code aber so aus:
...
Parameters.ParamByName('p1').Value:=StrPas(ID); ...
Delphi-Quellcode:
Was ist jetzt richtig? Da Du die ID auch als Array[1..13] of Char deklariert hast, musst Du diese ebenfalls mit StrPas(ID) umwandeln.
...
Parameters.ParamByName('p1').Value:=ID; ... |
Re: SQL Syntax Error? Was ist falsch?
:wiejetzt:
Ich wollte dir damit sagen, das beides zu einem Fehler führt: Zitat:
|
Re: SQL Syntax Error? Was ist falsch?
Hat keiner mehr eine Idee? ich brauche das unbedingt... :cry:
|
Re: SQL Syntax Error? Was ist falsch?
Moin, moin,
Delphi-Quellcode:
Erstmal so probieren, die überflüssigen Leerzeichen kannst Du später dann entfernen, so sieht man es aber besser.Clients.SQL.Add( 'INSERT INTO Clients ( ID, ClientNumber, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone ) VALUES ( "", " '+ ARDRecord.ID +' " , " '+ ARDRecord.Name +' " , " '+ ARDRecord.Strasse +' " , " '+ ARDRecord.PLZ +' " , " '+ ARDRecord.Ort +' " , " '+ ARDRecord.Tel +' " , " '+ ARDRecord.Mobil +' " );' ); Über größere Neuerungen kann man sich immernoch unterhalten, aber funktionieren sollte das schon. Grüße // Martin |
Re: SQL Syntax Error? Was ist falsch?
Hai Du,
wäre es möglich auch noch zu sagen welcher Fehler gemeldet wird? [Edit]Sorry. Ich war zu schnell :cry: Ich habe nur dein Posting gesehen und nicht die erste Seite des Threas beachtet! *Noch einmal "Tschuldigung" sagt[/EDIT] |
Re: SQL Syntax Error? Was ist falsch?
Dein TARDRecord ist Technik von gestern.
So speichert man heutzutage keine Daten. (Alternativen sind z.B. CSV-Format, XML, ...) Aber sei's drum. Du musst deine Daten in TARDRecord erstmal in "anständige" AnsiStrings übersetzen:
Delphi-Quellcode:
// Konvertierungsfunktion
function Get_ID(const r:TARDRecord):AnsiString; begin SetString(Result, PChar(@r.ID[1]), sizeof(r.ID)); end; Query1.Parameters.ParamByName('p1').Value:= Get_ID(ARDRecord); |
Re: SQL Syntax Error? Was ist falsch?
Danke für eure antworten... ich werds mal ausprobeiren. :coder:
@mschaefer: So hab ich das schon mehrmals probiert und immer nur den SQL Syntax Error bekommen. --> Der steht schon auf der 1. Seite irgendwo. :gruebel: Zu der Veralteten Technick: Ich weiß das das schon Schnee von Gestern ist, ich habe aber auch keine andere Idee, wie ich die Fremddatenbank sonst auslesen könnte. Das Ding ist nunmal, das ich sie schon auslesen kann und das ist schonmal viel wert. Ich muss den Scheiß jetzt halt nur noch in die Access DB rein bekommen... :wall: vielen Dank erstma codein |
Re: SQL Syntax Error? Was ist falsch?
Moin,
schone das Vokabular. Also vom SQL-Syntax ist das in Ordnung. Allerdings hat diese Verfahrensweise einen Haken: Das System bricht zusammen wenn Du Anführungszeichen >"< in einem der Stringwerte hast. Die müstest Du dann per Pos raussuchen und eben durch Blanks ersetzten, im BeforeInsert. Grüße // Martin |
Re: SQL Syntax Error? Was ist falsch?
Moin EvilCodein!
Wie ich vermute, willst du Daten aus einer Datei in eine Datenbank übertragen. Du baust so zu sagen eine Import-Routine. Um so eine Aufgabe zu lösen, muss man vor allem den Aufbau des eingelesenen Datensatzes kennen. Da der Record eine feste Länge hat und alle Felder immer gleich lang sind, hast du versucht ihn mit Hilfe des TARDRecord zu definieren. So weit so gut. Hier muss ich sagen, dass ich die „array[] of char“ vermeide. Es sei denn, ich benötige tatsächlich einzelne Chars oder möchte auf einzelne Bytes (sprich Buchstaben) eines Strings zugreifen. Um Daten zu importieren brauchst du doch keine einzelnen Chars, oder? Also hier meine Vorschläge in Bezug auf dein Problem: A. Benutze „String[Länge]“ statt „Array[X..Y] of Char“:
Delphi-Quellcode:
statt
TADRRecord = packed record
ID: string[13]; Anrede: string[13]; Name: string[87]; end;
Delphi-Quellcode:
B. Vermeide den Datentyp „Variant“, wenn immer es möglich ist:
TADRRecord = packed record
ID: array[1..13] of char; Anrede: array[1..13] of char; Name: array[1..87] of char; end;
Delphi-Quellcode:
statt
Query1.ParamByName('id').AsString := MyTestRecord.ID;
Delphi-Quellcode:
Query1.ParamByName('id').Value := MyTestRecord.ID;
Und nun ein vollständiges Test-Projekt:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Query1: TQuery; Label4: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type TestRecord = packed record ID: string[13]; Anrede: string[13]; Name: string[87]; end; var Form1: TForm1; MyTestRecord: TestRecord; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin MyTestRecord.ID := 'My_ID*'; MyTestRecord.Anrede := 'My_Anrede*'; MyTestRecord.Name := 'My_Name*'; end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := MyTestRecord.ID; Label2.Caption := MyTestRecord.Anrede; Label3.Caption := MyTestRecord.Name; Query1.SQL.Clear; Query1.SQL.Add('insert into customer (id,anrede,name)'); Query1.SQL.Add(' values (:id,:anrede,:name)'); Query1.ParamByName('id').AsString := MyTestRecord.ID; Query1.ParamByName('anrede').AsString := MyTestRecord.Anrede; Query1.ParamByName('name').AsString := MyTestRecord.Name; Query1.Prepare; Query1.ExecSQL; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz