![]() |
Datenbank: Access (MDB) • Version: XE10.2 • Zugriff über: TAdoTable
Einfügen eines neues Feldes in AdoTable
Hallo zusammen,
ich möche zur laufzeit neue felder in meine Access Datenbank einfügen. Es gibt mehrere vorschläge in diesem Forum aber es klappt bei mir nicht. Folgenden Code hab ich derzeit:
Code:
Weiss jemand warum das neue Feld nicht zugefügt wird ? Ich hab es auch mit "AdoTable1.Refresh" und sonstigem versucht, ohne erfolg.
var
AdoTable1: TAdoTable; Field: TField; Str1: String; ... If ADOTable1.FieldList.Find(Str1) = nil then Begin ADOTable1.Active := False; Field := TIntegerField.Create(AdoTable1); Field.FieldName := Str1; Field.DataSet := AdoTable1; AdoTable1.FieldDefs.Add(Str1, ftInteger); AdoTable1.Active := true; //-> Hier fehlermeldung das das Feld (Name im Str1) nicht gefunden wird End; ... Danke David |
AW: Einfügen eines neues Feldes in AdoTable
Dieses hier erstellt nur das TField für den Zugriff in deiner TAdoTable-Komponente,
aber ändert nicht die Datenbanktruktur und knallt dann natürlich, weil das Feld in der DB nicht existiert. Ich weiß nicht was die Komponente macht, wenn du sowas versuchst, während sie "Active" ist. Kannst du nicht irgendwo SQL-Statements ausführen? ![]() |
AW: Einfügen eines neues Feldes in AdoTable
Hallo Himitsu,
wenn die Datenbank aktiv ist bekomme ich den Fehler das ich die Struktur nicht verändern kann solang die Datenbank offen ist und benutzt wird. Ich hab schon an das SQL gedacht aber mein ADOTable hat keineuntergeordnete SQL function... :-( |
AW: Einfügen eines neues Feldes in AdoTable
SQL ausführen über sowas wie ein TAdoQuery?
Lässt du deine ADOTable die TField automatisch erstellen, oder sind die anderen Felder im Formdesigner angelegt? Wenn Letzteres, dann muß dort dann natürlich auch noch dein Feld rein, sonst kannst du nicht darauf zugreifen. (nachdem das Feld auch in der DB erstellt wurde) |
AW: Einfügen eines neues Feldes in AdoTable
Die anderen Felder wurden mit Access erstellt. Du meinst ich muss das Field zweimal erstellen: in der DB und dem AdoTable ?
Ich greife auf das Feld mit folgendem Befehl zu :
Code:
Mein AdoTable wird dynamisch geladen, ich hab also keine Komponente oder AdoQuery.
...
AdoTable1.FieldByName(Str1).Value ...
Code:
AdoTable1 := TAdoTable.Create(Form1);
ADOTable1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DataBaseWindowsPath + ';Persist Security Info=False'; ADOTable1.TableName := 'MyTable'; ADOTable1.Active := True; |
AW: Einfügen eines neues Feldes in AdoTable
In der DB musst du das Feld schon anlegen,
ob auch nochmal in der Zugriffskomponente (hier TAdoTable), das kommt drauf an. Bei den meisten solcher Komponenten gibt es ein entweder/oder. Entweder du erstellst manuell die/alle nötigen die TField (und kannst da dann auch noch paar kleine Anpassungen vornehmen, wie z.B. Formatierung ala DisplayFormat oder die Size) oder die Komponente erstellt die TField automatisch, anhand der abgefragten Tabelle oder des Ergebnisses eines Selects. Sobald aber ein TField von dir erstellt wurde, dann wird die Automatik deaktiviert. (leider) Sind also keine TField von dir erstellt worden (z.B. im Code oder über den Field-Editor im Formdesigner), dann brauchst du dieses neue Feld da auch nicht hinzuzufügen. |
AW: Einfügen eines neues Feldes in AdoTable
Hallo,
hier steht was dazu ![]() ziemlich weit unten (AdoTable.SQL.Add) oder hier ![]() ganz unten |
AW: Einfügen eines neues Feldes in AdoTable
Hallo,
TAdoTable hat keine SQL function, und TAdoQTable is wahrscheinliche eine third-party komponente. Die gibt es bei mir nicht. Nach langen probieren, geht es nun. Die lösung :
Code:
var
AdoTable1: TAdoTable; AdoConnection: TADOConnection; AdoQuery: TAdoQuery; Str1: String; ... If ADOTable1.FieldList.Find(Str1) = nil then Begin ADOTable1.Active := False; AdoConnection := TADOConnection.Create(Form1); AdoQuery := TAdoQuery.Create(Form1); AdoConnection.ConnectionString := AdoTable1.ConnectionString ; AdoConnection.LoginPrompt := False; AdoConnection.Connected := True; AdoQuery.Connection := AdoConnection; AdoQuery.Active := False; AdoQuery.SQL.Clear; Adoquery.SQL.Add('ALTER TABLE ' + TableName + ' ADD ' + FieldName + ' INTEGER'); Adoquery.ExecSQL; Adoquery.Free; AdoConnection.Connected := False; AdoConnection.Free; AdoTable1.Active := true; End; |
AW: Einfügen eines neues Feldes in AdoTable
Hallo,
ja, siehe auch mein 2. Link. |
AW: Einfügen eines neues Feldes in AdoTable
Delphi-Quellcode:
:zwinker:
AdoQuery.Connection := AdoTable1.Connection;
Und ein paar Ressourcenschutzblöcke können nie schaden. (Try-Finally ab Create bis Free) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz