Hallo liebe Community!
Ich versuche gerade kopfzerbrechend einen Fehler bei mir zu finden und komme einfach nicht weiter...
Grundgedanke:
Ich möchte/muss einige Spaltennamen in DBASE III umbenennen. Da der
ODBC-Treiber "dumm" ist, klappt ja kein "ALTER TABLE".
Deswegen speichere ich mir meine DBF-File in eine DBTable und führe dann mit einem
Query ein "DROP", sowie ein "CREATE TABLE" mit den veränderten Spaltennamen aus.
Danach lade ich mir über den
Query alle Daten aus meiner DBTabelle in die neu erstellte DBF-Tabelle.
Das möchte ich natürlich für mehrere Tabellen machen und führe deswegen ein Loop durch meinen "Datenbank-Ordner".
Diese Prozedure funktioniert einmnal und beim Laden der nächsten Tabelle in die DBTabelle tritt ein Fehler auf... ziemlich unlogischer, nebenbei bemerkt... :
"Es ist eine
Exception der Klasse ESQLiteError mit der Meldung 'database table is locked' aufgetreten".
Ich verstehe weder, warum eine SQLite-
Exception auftritt, noch warum die Tabelle locked ist, da ich sie ja noch nicht mal verwendet habe..
Hier meine Prozedur/Funktion:
Code:
function Tfrm_Main.Alter_DBF_Tables: Boolean;
const
aTables:Array [0..6] of String = ('ALARM','CODBU','BACOFFST','HCLESE','HCRCAGRP','PERSCOD','SYSPARA');
var
I,itablecnt,ibookingcnt: Integer;
stable:string;
begin
UniTableSource.active:=false;
UniTableSource.Connection:=UniConDBF;
UniQuery.Active:=false;
UniQuery.Connection:=UniConDBF;
ibookingcnt:=1;
itablecnt:=0;
while itablecnt< length(aTables) do
begin
stable:= aTables[itablecnt];
if Check_BookingTable(sTable.ToUpper) then
begin
stable:= Format(stable+'%.*d',[2,ibookingcnt]);
Inc(ibookingcnt);
end;
if not fileexists(UniConDBF.Database+sTable+'.dbf') then
begin
if not Check_BookingTable(sTable.ToUpper) then
Inc(itablecnt)
else if ibookingcnt>12 then
Inc(itablecnt);
continue;
end;
UniTableSource.active:=false;
UniTableSource.TableName:=stable;
UniTableSource.active:=true;
UniQuery.SQL.Text:='DROP TABLE '+stable;
UniQuery.ExecSQL;
UniQuery.SQL.Clear;
UniQuery.SQL.Add('CREATE TABLE '+stable+'(');
for I := 0 to UniTableSource.Fieldcount-1 do
begin
if Check_Column(UniTableSource.Fields[i].FieldName.ToUpper) then
UniQuery.SQL.Add('A'+UniTableSource.Fields[i].FieldName.ToUpper+' ')
else
UniQuery.SQL.Add(UniTableSource.Fields[i].FieldName.ToUpper+' ');
UniQuery.SQL.Add(Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper);
if Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper='CHAR' then
if UniTableSource.Fields[i].DataSize>254 then
UniQuery.SQL.Add(' (254)')
else
UniQuery.SQL.Add(' ('+UniTableSource.Fields[i].DataSize.ToString+')');
if i<UniTableSource.Fieldcount-1 then
UniQuery.SQL.Add(',')
else
UniQuery.SQL.Add(')');
end;
UniQuery.ExecSQL;
UniQuery.SQL.Clear;
while not UniTableSource.EOF do
begin
UniQuery.SQL.Clear;
UniQuery.SQL.Add('INSERT INTO '+stable+' VALUES(');
for I := 0 to UniTableSource.Fieldcount-1 do
begin
if Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper='CHAR' then
UniQuery.SQL.Add(QuotedStr(UniTableSource.Fields[i].AsString))
else
UniQuery.SQL.Add(UniTableSource.Fields[i].AsString);
if i<UniTableSource.Fieldcount-1 then
UniQuery.SQL.Add(',')
else
UniQuery.SQL.Add(');');
end;
UniQuery.ExecSQL;
UniTableSource.Next;
end;
if not (Check_BookingTable(sTable.ToUpper)) then
begin
Inc(itablecnt);
ibookingcnt:=1;
end;
end;
end;
Ich hoffe Ihr könnt mir irgendwie weiter helfen .. ich steh auf dem Schlauch
Grüße Kondzie!