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