Hallo,
erstmal Danke für Eure Mühen (und Geduld!)!
Mein Problem ist folgendes: Ich habe ein Programm veröffentlicht, bei dem mir zwar noch nicht jetzt, aber vielleicht irgendwann die Datensatzspalten in einer Tabelle knapp werden könnten. Um die Kompatibilität zu erhalten wäre es natürlich schon recht gut, wenn nach einem Update auch die zugrunde liegende Datenbank automatisch und vom Anwender unbemerkt um einige Spalten erweitert werden könnte.
Und das Anlegen einer neuen Spalte gelingt ja auch mit folgendem Code: ("X1" und "X2" sind die neuen Spalte)
Code: Alles auswählen
try
form1.ZConn1.ExecuteDirect( ' Alter TABLE "tText" ADD "X1" VARCHAR(100)');
form1.ZConn1.ExecuteDirect( ' Alter TABLE "tText" ADD "X2" VARCHAR(100)');
except
end;
oder natürlich auch mit dem Code von Michl:
Code: Alles auswählen
procedure TForm1.AddNewColClick(Sender: TObject);
begin
if not Assigned(ZQuery1.FindField('newcol')) then begin
ZQuery1.Close;
ZConnection1.ExecuteDirect('ALTER TABLE sometable ADD COLUMN newcol VARCHAR;');
ZQuery1.Open;
end;
end;
Alledings kommt es bei beiden Varianten zu der oben mit Screenshot bereits gezeigten Fehlermeldung: "Duplicate column ..." . Dies ist aber wenig tragisch, man kann die Fehlermeldung ja ignorieren, bzw. während der Programmerstellung festlegen, diesen Fehler nicht mehr zu melden. (Ob das langfristig aber klug ist, weiß ich nicht)
Jedenfalls wird offenbar folgende Abfrage (@Michl) ignoriert:
Aber wie gesagt: Die neuen Spalten werden angelegt und sind auch manchmal
!? nutzbar.
Manchmal deshalb, weil man mit folgendem Code völlig problemlos etwas in die Datenbank schreiben kann: ("X1" ist die neue Spalte)
Code: Alles auswählen
procedure TForm1.Bt_lock_setzenClick(Sender: TObject);
begin
With form1.QText_ID do // QText_ID !!!!
Begin
SQL.Clear;
SQL.Text := 'UPDATE tText SET X1 = :sneu';
SQL.Add(' WHERE rID = :sID');
ParamByName('sneu').AsString := Inttostr(ID_Zufall) ;
ParamByName('sID').AsString := Form1.QText.FieldByName('rID').AsString; // von QText! nicht QText_ID !!
ExecSQL;
Open;
end;
end;
... mit folgendem Code aber einen Feldinhalt leider nicht auslesen kann!! ("X1" ist die neue Spalte)
Code: Alles auswählen
Procedure TForm1.Meine_Procedur;
var
sss : string;
begin
sss := Form1.QText_ID.FieldByName('X1').AsString;
end;
Und das ist ausgesprochen schade!!!
Gibt es tatsächlich keine Möglichkeit, zur Laufzeit bei einer Datenbank eine Tabellenspalte neu anzulegen und uneingeschränkt mit dieser Tabelle zu arbeiten?
Aliobaba