Delphi-PRAXiS

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?

Gollum 11. Mai 2005 14:49

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

EvilCodein 11. Mai 2005 14:57

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

Gollum 11. Mai 2005 15:02

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

in Deinem Postin schreibts Du, Du hättest es jetzt so gemacht:
Delphi-Quellcode:
  ...
  Parameters.ParamByName('p1').Value:=StrPas(ID);
  ...
In Deiner Debug-Übersicht sieht der Code aber so aus:
Delphi-Quellcode:
  ...
  Parameters.ParamByName('p1').Value:=ID;
  ...
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.

EvilCodein 11. Mai 2005 15:09

Re: SQL Syntax Error? Was ist falsch?
 
:wiejetzt:

Ich wollte dir damit sagen, das beides zu einem Fehler führt:

Zitat:

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'
Die erste Fehlermeldung mit StrPas() die zweite ohne StrPas(). :coder2:

EvilCodein 11. Mai 2005 16:13

Re: SQL Syntax Error? Was ist falsch?
 
Hat keiner mehr eine Idee? ich brauche das unbedingt... :cry:

mschaefer 11. Mai 2005 16:54

Re: SQL Syntax Error? Was ist falsch?
 
Moin, moin,

Delphi-Quellcode:

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  +' " );'
               
                 );
Erstmal so probieren, die überflüssigen Leerzeichen kannst Du später dann entfernen, so sieht man es aber besser.
Über größere Neuerungen kann man sich immernoch unterhalten, aber funktionieren sollte das schon.

Grüße // Martin

Sharky 11. Mai 2005 16:55

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]

shmia 11. Mai 2005 16:55

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

EvilCodein 12. Mai 2005 09:37

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

mschaefer 12. Mai 2005 09:47

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

MarkusB 12. Mai 2005 13:07

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:
TADRRecord = packed record
  ID: string[13];
  Anrede: string[13];
  Name: string[87];
end;
statt

Delphi-Quellcode:
TADRRecord = packed record
  ID: array[1..13] of char;
  Anrede: array[1..13] of char;
  Name: array[1..87] of char;
end;
B. Vermeide den Datentyp „Variant“, wenn immer es möglich ist:

Delphi-Quellcode:
Query1.ParamByName('id').AsString    := MyTestRecord.ID;
statt
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