![]() |
Datenbank: SqLite • Version: 3.42.0 • Zugriff über: FireDAC
SQL Semicolon im String -> Fehler bei Insert
Einfügen von Strings (Singlequoted) mit Semicolon im String.
Code:
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.
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) + ');'); 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. |
AW: SQL Semicolon im String -> Fehler bei Insert
Hallöle...8-)
Zitat:
Delphi-Quellcode:
PS: Diese QuotedStr Orgien machen mir immer Gänsehaut...:?
+ QuotedStr(tblDataFileName.AsWideString) + '),');
.. + QuotedStr(tblDataFileName.AsWideString) + ');'); // hier Semikolon richtig? ...mit Parametern wäre das nicht passiert. Zeige mal den Teil wo du das 'INSERT' SQL der Query zuweist... Parameter: ![]()
Delphi-Quellcode:
FDQuery1.SQL.Text := 'select * from tab where code = :Code';
FDQuery1.ParamByName('code').AsString := '123'; FDQuery1.Open; |
AW: SQL Semicolon im String -> Fehler bei Insert
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. \ |
AW: SQL Semicolon im String -> Fehler bei Insert
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; |
AW: SQL Semicolon im String -> Fehler bei Insert
Zitat:
Zitat:
|
AW: SQL Semicolon im String -> Fehler bei Insert
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. |
AW: SQL Semicolon im String -> Fehler bei Insert
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 ? |
AW: SQL Semicolon im String -> Fehler bei Insert
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. |
AW: SQL Semicolon im String -> Fehler bei Insert
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... |
AW: SQL Semicolon im String -> Fehler bei Insert
Zitat:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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