![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 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