Einzelnen Beitrag anzeigen

Kondzie

Registriert seit: 7. Aug 2019
5 Beiträge
 
#1

DBF Spaltennamen ändern

  Alt 7. Aug 2019, 14:41
Datenbank: DBF • Version: 3 • Zugriff über: UniDac
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!
  Mit Zitat antworten Zitat