Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Syntax Error? Was ist falsch? (https://www.delphipraxis.net/45729-sql-syntax-error-ist-falsch.html)

EvilCodein 11. Mai 2005 13:44

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:
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;
Bitte helft mir, ich komme hier einfach nicht weiter :wall:

Bernhard Geyer 11. Mai 2005 13:53

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.

Gollum 11. Mai 2005 13:57

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

EvilCodein 11. Mai 2005 14:03

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

EvilCodein 11. Mai 2005 14:10

Re: SQL Syntax Error? Was ist falsch?
 
Hi Gollum!

Thx für dienen Vorschlag...
Ich bekomme jetzt aber das hier

Delphi-Quellcode:
[Error] EDMUnit.pas(351): Bad argument type in variable type array constructor
:cry: Das schlimme ist, ich kann damit nichts anfangen... :gruebel:

Gollum 11. Mai 2005 14:11

Re: SQL Syntax Error? Was ist falsch?
 
Hallo,

hast Du mal meine Version ausprobiert?

Das selbe Spielchen aber diesmal mit Parameter:

Delphi-Quellcode:
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
...
Edit:
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.

EvilCodein 11. Mai 2005 14:24

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

SvB 11. Mai 2005 14:30

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

Gollum 11. Mai 2005 14:34

Re: SQL Syntax Error? Was ist falsch?
 
Hallo,

Zitat:

Zitat von EvilCodein
Das Feld ID in der Access-DB ist ein AutoIncrement-Feld

wenn das so ist, dann musst Du im Insert-Statement das Feld ID weglassen. Siehe auch Post von SvB.

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

EvilCodein 11. Mai 2005 14:35

Re: SQL Syntax Error? Was ist falsch?
 
OK sie schaut jetzt so aus:

Delphi-Quellcode:
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;
Das Problem ist jetzt bekomme ich diese Fehlermeldung:
[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 17:21 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz