![]() |
Datenbank: Sqlite • Version: 3 • Zugriff über: D7
Zeos Sqlite probleme beim erstellen von Einträgen
Hi,
ich versuche gerade mich ein wenig in Datenbanken einzuarbeiten. Ich habe folgenden Code erstellt:
Delphi-Quellcode:
Leider kommt es beim btn1Click zu folgendem Fehler:
procedure TForm1.FormCreate(Sender: TObject);
begin with ZCon do begin Protocol := 'sqlite-3'; Database := 'bla.sql'; Connect; end; Zqry.Connection := ZCon; try Zqry.SQL.Text := 'CREATE TABLE IF NOT EXISTS `product` (' + '`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' + '`producer` TEXT NOT NULL,' + '`name` TEXT NOT NULL,' + '`category` TEXT NOT NULL,' + '`wohnort` TEXT NOT NULL,' + '`size` INTEGER NOT NULL' + ');'; Zqry.ExecSql; finally ZCon.Connected := false; end; end; procedure TForm1.btn1Click(Sender: TObject); begin try ZCon.Connected := true; Zqry.SQL.Text := 'INSERT INTO `product` ' + '(`id`, `producer`, `name`, `category`, `wohnort`, `size`)' + ' VALUES ' + '('''', ''' + 'bla' + ''', ''' + 'blub' + ''', ''' + 'lol' + ''', ''' + 'ort' + ''', ''' + '31139' + ''');'; Zqry.ExecSql; //SQL-Statement ausführen finally ZCon.Connected := False; //Verbindung trennen end; end; --------------------------- Debugger Exception Notification --------------------------- Project Project1.exe raised exception class EZSQLException with message 'SQL Error: datatype mismatch'. Process stopped. Use Step or Run to continue. --------------------------- OK Help --------------------------- Welcher Datentyp passt denn dort nicht ? Gruß Yannic |
AW: Zeos Sqlite probleme beim erstellen von Einträgen
id füllst Du mit einem Leerstring. Aber als INTEGER Autoincrement definiert, also NULL oder garnichts angeben
Delphi-Quellcode:
Würde aber 1) mit Parametern arbeiten (die QuoteOrgie ist ja schrecklich) oder wenigstens mit QuotedStr()
' VALUES ' +
'(NULL, ''' + und 2) auf CaseSensitive Tabellen/Feldnamen verzichten
Delphi-Quellcode:
Den Vorteil von Parametern solltest Du sehen. Zusätzlich kannst den Code universell umbauen
try
Zqry.SQL.Text := 'CREATE TABLE IF NOT EXISTS product (' + 'id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' + 'producer TEXT NOT NULL,' + 'name TEXT NOT NULL,' + 'category TEXT NOT NULL,' + 'wohnort TEXT NOT NULL,' + 'size INTEGER NOT NULL' + ');'; Zqry.ExecSql; [...] Zqry.SQL.Text := 'INSERT INTO product ' + '(id, producer, name, category, wohnort, size)' + ' VALUES(NULL, :producer, :name, :category, :wohnort, :size);'; ZQry.ParamByName('producer').AsString := 'Firma GmbH'; ZQry.ParamByName('name').AsString := 'Max Mustermann'; ZQry.ParamByName('category').AsString := 'Software-Entwicklung'; ZQry.ParamByName('wohnort').AsString := '10000 Berlin'; ZQry.ParamByName('size').AsInteger := 4711; Zqry.ExecSql; //SQL-Statement ausführen
Delphi-Quellcode:
Dann denk' nochmal über Dein Denglish nach ;)
procedure MyInsert(producer, name, category, wohnort: String; size : Integer);
begin [...] Zqry.SQL.Text := 'INSERT INTO product ' + '(id, producer, name, category, wohnort, size)' + ' VALUES(NULL, :producer, :name, :category, :wohnort, :size);'; ZQry.ParamByName('producer').AsString := producer; ZQry.ParamByName('name').AsString := name; ZQry.ParamByName('category').AsString := category; ZQry.ParamByName('wohnort').AsString := wohnort; ZQry.ParamByName('size').AsInteger := size; [...] end; Innerhalb Delphi Bezeichner und CO am liebsten in Englisch. Tabelle/FeldName darf aber Deutsch sein (seltener Namenskonflikte). Nur dann bitte ganz in deutsch: Produzent, Name, Kategorie, Wohnort, Groesse PS: Name ist schon so ein ungünstigstes Wort... nehme da gerne Firmenname, Vorname, Nachname oder was passt, dann umgeht man einen evtl. Konflikt mit dem englischen name, das schon oft als Bezeicher genommen wird.. |
AW: Zeos Sqlite probleme beim erstellen von Einträgen
Hi,
vielen Dank :) Mit den Parametern klappt das echt super :) Die Namen waren nur schnell belibig hingeschmiert um überhaupt erstmal die Funktionsweise zu testen :thumb: Ein kleines Problem habe ich nun aber noch. Ich habe jetzt mal versucht die Einträge aus der Datenbank in eine ListView einzutragen. Klappt soweit auch ganz gut, allerdings möchte ich nun noch ein Suchkreterium einbauen. In Access ging das immer mit Wie *Mustermann*. So wurden nun alle Namen gelistet in den Mustermann vorkommt. Ich habe es nun so versucht:
Delphi-Quellcode:
Wie muss der Syntax korrekt lauten ?
try
ZCon.Connected := true; Zqry.SQL.Text := 'SELECT * FROM product WHERE producer = *mustermann* ORDER BY producer'; Zqry.Open; while not Zqry.Eof do begin Item := lv1.Items.Add; Item.Caption := Zqry.FieldByName('id').AsString; Item.SubItems.Add(Zqry.FieldByName('category').AsString); Item.SubItems.Add(Zqry.FieldByName('producer').AsString); Item.SubItems.Add(Zqry.FieldByName('product').AsString); Item.SubItems.Add(Zqry.FieldByName('size').AsString); Item.Data := Pointer(Zqry.FieldByName('id').AsInteger); Zqry.Next; end; finally Zqry.Close; ZCon.Connected := false; end; Gruß Yannic |
AW: Zeos Sqlite probleme beim erstellen von Einträgen
Hat sich erledigt :)
Trotzdem Danke |
AW: Zeos Sqlite probleme beim erstellen von Einträgen
andere Frage anderer Thread usw... ;)
Also WHERE producer LIKE '%mustermann%' müsste gehen, wobei ich grad nicht 100% sicher bin, ob % am Anfang korrekt ist. Syntax zu SQlite ist bei ![]() €: Das "hat sich erledig" musst Du geschrieben haben, als ich im Editor war? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 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