Einzelnen Beitrag anzeigen

DaCoda

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

AW: SQL Semicolon im String -> Fehler bei Insert

  Alt 28. Mai 2024, 01:59
Manchmal sitzt der Fehler aber auch einfach vor dem Bildschirm, das berühmte "40cm Problem"

Ich habe das Backup/Restore Backup/Restore mal anders gelöst, wegen UTF8-Codierung und es geht so auch schneller:

Code:
const
  EmptyStr = '';

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
  SL: TStringList;

begin
  SL := TstringList.Create;
  try
    tblData.Active := True;
    tblData.Open;

    if tblData.RecordCount > 0 then begin

      SL.Add('-- --------------------------------------------------------');
      SL.Add('-- Host: ' + DbName + SqLiteSqlExt);
      SL.Add('-- Server-Version: ' + dmMain.SqlConnection.Drivername + ' Version : ' + GetSqlVersion);
      SL.Add('-- Server - Betriebssystem: ' + TOSVersion.Name);
      SL.Add('-- Generator: ' + FileVersion.strProductName + Space + strVersion + FileVersion.strFileVersion);
      SL.Add('-- --------------------------------------------------------');

      SL.Add(EmptyStr);

      SL.Add('-- Exportiere Datenbank - Struktur für Mediathek');
      SL.Add('/*!40000 CREATE DATABASE if not EXISTS Mediathek */;');

      SL.Add(EmptyStr);

      SL.Add('-- Exportiere Struktur von Tabelle Mediathek.Mediathek');
      SL.Add('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);');

      SL.Add(EmptyStr);

      SL.Add('-- Exportiere Daten aus Tabelle Mediathek.Mediathek');
      SL.Add('DELETE FROM Mediathek;');
      SL.Add('/*!40000 ALTER TABLE Mediathek DISABLE KEYS */;');

      SL.Add(EmptyStr);

      pbProgress.Style := pbstMarquee;
      tblData.First;
      while not (tblData.Eof or boAborted) do begin
        SL.Add('INSERT INTO Mediathek VALUES (' + QuotedStr(tblDataID.AsString) + ',' + QuotedStr(tblDataInterpret.AsWideString) + ',' + QuotedStr(tblDataAlbum.AsWideString) + ',' + QuotedStr(tblDataTitel.AsWideString) + ',' + QuotedStr(tblDataFileName.AsWideString) + ');');
        tblData.Next;
        Application.ProcessMessages;
      end;
      pbProgress.Style := pbstNormal;

      SL.Add('/*!40000 ALTER TABLE Mediathek ENABLE KEYS */;');

      SL.Add(EmptyStr);

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

      SL.Add(EmptyStr);

      SL.Add('-- Exportiere Daten aus Tabelle Mediathek.TempData');
      SL.Add('DELETE FROM TempData;');
      SL.Add('/*!40000 ALTER TABLE TempData DISABLE KEYS */;');
      SL.Add('/*!40000 ALTER TABLE TempData ENABLE KEYS */;');
      SL.SaveToFile(SqlBackupFileName, TEncoding.UTF8);
    end;

    tblData.Close;
    tblData.Active := False;
  finally
    FreeANdNil(SL);
  end;
end;

procedure TfrmBackupRestore.DoRestore;
var
  SL: TStringList;
  Loop: Integer;

begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(SqlBackupFileName, TEncoding.UTF8);
    if SL.Count > 0 then begin
      for Loop := 0 to SL.Count - 1 do begin
        if SL[Loop] <> EmptyStr then begin
          try
            qryData.SQL.Text := SL[Loop];
            qryData.ExecSQL;
            Application.ProcessMessages;
          except
            // TODO
          end;
        end;
      end;
    end;
  finally
    FreeAndNil(SL);
  end;
end;
Allerdings haben meine DBMS-Tools an dieser Stelle offensichtlich auch einen Fehler.
Meine SQL-Sicherung wird nun anstandslos von den Tools verarbeitet.
Ich habe aber auch eine Restore-Procedure mit gepostet...

Also Danke Euch für Eure Hilfe und Tipps
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat