AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Semicolon im String -> Fehler bei Insert
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Semicolon im String -> Fehler bei Insert

Ein Thema von DaCoda · begonnen am 26. Mai 2024 · letzter Beitrag vom 28. Mai 2024
Antwort Antwort
Seite 1 von 2  1 2      
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#1

SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 17:44
Datenbank: SqLite • Version: 3.42.0 • Zugriff über: FireDAC
Einfügen von Strings (Singlequoted) mit Semicolon im String.
Code:
      tblData.First;
      WriteLn(SqlFile, 'INSERT INTO Mediathek (' + QuotedStr('ID') + ',' + QuotedStr('Interpret') + ',' + QuotedStr('Album') + ',' + QuotedStr('Titel') + ',' + QuotedStr('FileName') + ') VALUES');

      Caption := tblData.RecordCount.ToString;
      for Loop := 0 to tblData.RecordCount - 2 do begin
        WriteLn(SqlFile, '(' + tblDataID.AsString + ',' + QuotedStr(tblDataInterpret.AsWideString) + ',' + QuotedStr(tblDataAlbum.AsWideString) + ',' + QuotedStr(tblDataTitel.AsWideString) + ',' + QuotedStr(tblDataFileName.AsWideString) + '),');
        tblData.Next;
        Application.ProcessMessages;
      end;
      tblData.Last;
      WriteLn(SqlFile, '(' + tblDataID.AsString + ',' + QuotedStr(tblDataInterpret.AsWideString) + ',' + QuotedStr(tblDataAlbum.AsWideString) + ',' + QuotedStr(tblDataTitel.AsWideString) + ',' + QuotedStr(tblDataFileName.AsWideString) + ');');
Dabei gibt es das Problem das wegen dem Semicolon ein Fehler auftritt. (Vermutlich auch bei '). ALso der Fehler entsteht beim einlesen der SQL-Datei, zB. mit HeidiSQL.
Beispiel einer Zeile:
INSERT INTO Mediathek ('ID','Interpret','Album','Titel','FileName') VALUES
(9,'Jethro Tull','Benefit','Sossity; You''re a Woman','M:\Musik\Jethro Tull\Benefit\10 Sossity; You''re a Woman.mp3');
...

Ich finde die Lösung einfach nicht.
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 17:52
Hallöle...
Zitat:
Ich finde die Lösung einfach nicht.
Delphi-Quellcode:
+ QuotedStr(tblDataFileName.AsWideString) + '),');
..
+ QuotedStr(tblDataFileName.AsWideString) + ');'); // hier Semikolon richtig?
PS: Diese QuotedStr Orgien machen mir immer Gänsehaut...

...mit Parametern wäre das nicht passiert. Zeige mal den Teil wo du das 'INSERT' SQL der Query zuweist...
Parameter:
https://docwiki.embarcadero.com/RADS...ngen_(FireDAC)
Delphi-Quellcode:
FDQuery1.SQL.Text := 'select * from tab where code = :Code';
FDQuery1.ParamByName('code').AsString := '123';
FDQuery1.Open;

Geändert von haentschman (26. Mai 2024 um 18:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 18:00
Parameter, Parameter, Parameter, Parameter, ..........


ODER, man sollte gefällgist einige "richtige" Funktion für das Escaping verwenden
QuoteStr ist und war noch niemals für SQLs, denn es kennt ausschließlich die Syntax von PascalStrings, aber kein nicht die Syntax vom SQL, wie z.B. \
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 18:10
Die Routine sieht so aus:

Code:
function TfrmBackupRestore.GetSqlVersion: string;
begin
  Result := 'Unbekannt';
  try
    with qryData.SQL do begin
      Clear;
      Add('SELECT sqlite_version()')
    end;
    qryData.Open;
    Result := qryData.FieldByName('sqlite_version()').AsString;
    qryData.CLose;
  finally

  end;
end;

procedure TfrmBackupRestore.DoBackup;
var
  SqlFile: TextFile;
  Loop: Integer;
begin
  AssignFile(SqlFile, SqlBackupFileName);
  Rewrite(SqlFile);
  if IOResult = 0 then begin
    tblData.Active := True;
    tblData.Open;
    try
      WriteLn(SqlFile, '-- --------------------------------------------------------');
      WriteLn(SqlFile, '-- Host: ' + DbName + SqLiteSqlExt);
      WriteLn(SqlFile, '-- Server-Version: ' + dmMain.SqlConnection.Drivername + ' Version : ' + GetSqlVersion);
      WriteLn(SqlFile, '-- Server - Betriebssystem: ' + TOSVersion.Name);
      WriteLn(SqlFile, '-- Generator: ' + FileVersion.strProductName + Space + strVersion + FileVersion.strFileVersion);
      WriteLn(SqlFile, '-- --------------------------------------------------------');
      WriteLn(SqlFile);

      WriteLn(SqlFile, '-- Exportiere Datenbank - Struktur für Mediathek');
      WriteLn(SqlFile, '/*!40000 CREATE DATABASE if not EXISTS Mediathek */;');
      WriteLn(SqlFile);

      WriteLn(SqlFile, '-- Exportiere Struktur von Tabelle Mediathek.Mediathek');
      WriteLn(SqlFile, 'CREATE TABLE if not EXISTS Mediathek(ID INTEGER PRIMARY KEY AUTOINCREMENT, Interpret VARCHAR not NULL, Album VARCHAR not NULL, Titel VARCHAR not NULL, FileName VARCHAR not NULL UNIQUE);');
      WriteLn(SqlFile);

      WriteLn(SqlFile, '-- Exportiere Daten aus Tabelle Mediathek.Mediathek');
      WriteLn(SqlFile, 'DELETE FROM Mediathek;');
      WriteLn(SqlFile, '/*!40000 ALTER TABLE "Mediathek" DISABLE KEYS */;');

      tblData.First;
      WriteLn(SqlFile, 'INSERT INTO Mediathek (' + QuotedStr('ID') + ',' + QuotedStr('Interpret') + ',' + QuotedStr('Album') + ',' + QuotedStr('Titel') + ',' + QuotedStr('FileName') + ') VALUES');

      Caption := tblData.RecordCount.ToString;
      for Loop := 0 to tblData.RecordCount - 2 do begin
        WriteLn(SqlFile, '(' + tblDataID.AsString + ',' + QuotedStr(tblDataInterpret.AsWideString) + ',' + QuotedStr(tblDataAlbum.AsWideString) + ',' + QuotedStr(tblDataTitel.AsWideString) + ',' + QuotedStr(tblDataFileName.AsWideString) + '),');
        tblData.Next;
        Application.ProcessMessages;
      end;
      tblData.Last;
      WriteLn(SqlFile, '(' + tblDataID.AsString + ',' + QuotedStr(tblDataInterpret.AsWideString) + ',' + QuotedStr(tblDataAlbum.AsWideString) + ',' + QuotedStr(tblDataTitel.AsWideString) + ',' + QuotedStr(tblDataFileName.AsWideString) + ');');

      WriteLn(SqlFile, '/*!40000 ALTER TABLE "Mediathek" ENABLE KEYS */;');
      WriteLn(SqlFile);

      WriteLn(SqlFile, '-- Exportiere Struktur von Tabelle Mediathek.TempData');
      WriteLn(SqlFile, 'CREATE TABLE IF NOT EXISTS TempData (ID INTEGER PRIMARY KEY AUTOINCREMENT, OrgId INT NOT NULL UNIQUE, FileName VARCHAR NOT NULL UNIQUE);');
      WriteLn(SqlFile);

      WriteLn(SqlFile, '-- Exportiere Daten aus Tabelle Mediathek.TempData');
      WriteLn(SqlFile, 'DELETE FROM TempData;');
      WriteLn(SqlFile, '/*!40000 ALTER TABLE "TempData" DISABLE KEYS */;');
      WriteLn(SqlFile, '/*!40000 ALTER TABLE "TempData" ENABLE KEYS */;');
    finally
      CloseFile(SqlFile);
    end;
    tblData.Close;
    tblData.Active := False;
  end else begin
    ErrorDialog('Die Sicherungsdatei: ' + SqlBackupFileName + CRLF + 'konnte nicht angelegt werden !');
  end;
end;
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 18:31
...mit Parametern wäre das nicht passiert. Zeige mal den Teil wo du das 'INSERT' SQL der Query zuweist...
Ich vermute, das ist hier gar nicht gegeben:
ALso der Fehler entsteht beim einlesen der SQL-Datei, zB. mit HeidiSQL.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#6

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 19:16
Das Problem ist ja, das diese Semikolons oder auch manchmal ' da sind und auch müssen...

Wenn ich aber die endgültige Backup.sql zB. mit Heidi-SQL oder SqLite-Expert ausführe, dann führt das zu Fehlern.
Und das möchte ich irgendwie hinbekommen, OHNE diese Zeichen zu entfernen.
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 26. Mai 2024, 20:49
Bei vielen DBMS/Tools kann man auch Zeichen umdefinieren und z.B. ein anderes Zeichen/Zeichengruppe für die Trennung der einzelnen SQL-Statements verwenden.

Gibt es im MySQL auch sowas wie \u12AF ?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Mai 2024 um 20:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 27. Mai 2024, 14:33
Dann trag doch einfach mal einen Record von Hand in die DB ein, der solche Zeichen enthält. Und mach dann einen Export mit den Tools die Du auch für den Import verwenden willst.
In dem Export sollten die Zeichen ja so kodiert sein dass es passt.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#9

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 27. Mai 2024, 18:31
Hallo Sinspin,
das war mal eine Top-Idee. Hab ich auch gleich mal gemacht.
Das Ergebnis ist ernüchternd. Das SQL-Backup wurde anstandslos erzeugt, aber bein einlesen gibt es dann wieder das Problem...
Also liegt es gar nicht mal unbedingt an meiner Backupfunktion.
Da ich aber sowieso im Moment SqLite nehme brauche ich auch gar nicht so eine Funktion, weil ich die gesamte Datei ja kopieren kann.

Mein Plan war natürlich größer und wollte eine allgemeine Unit machen, um Datenbanken zu sichern und zurück zu lesen. Weil sowas ja bei FireDAC immer noch fehlt.
UniDAC ist da schon immer etwas weiter und hat diese Funktionalität, ich möchte aber nicht noch eine "Fremdsoftware" dazu kaufen, da ich nur für mich (Hobby) programmiere...
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 27. Mai 2024, 18:40
UniDAC ist da schon immer etwas weiter und hat diese Funktionalität,
Hmmmmm, ob das inzwischen auf im PgDAC drin ist?

Nja, wir rufen da einfach die psql.exe mehrfach auf und lassen sie den Export je einer Tabelle in eine SQL-Datei machen, inzwischen mit einer Pipe durch die 7z.exe, um es nochmal als ZIP zu verpacken.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
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