AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Einfügen eines neues Feldes in AdoTable
Thema durchsuchen
Ansicht
Themen-Optionen

Einfügen eines neues Feldes in AdoTable

Ein Thema von DavidKlimas · begonnen am 15. Aug 2018 · letzter Beitrag vom 16. Aug 2018
Antwort Antwort
Seite 1 von 2  1 2      
DavidKlimas

Registriert seit: 24. Sep 2006
Ort: Arlon, Belgien
71 Beiträge
 
#1

Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 13:18
Datenbank: Access (MDB) • Version: XE10.2 • Zugriff über: TAdoTable
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:
  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;

   ...
Weiss jemand warum das neue Feld nicht zugefügt wird ? Ich hab es auch mit "AdoTable1.Refresh" und sonstigem versucht, ohne erfolg.

Danke

David
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#2

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 13:42
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?
https://msdn.microsoft.com/de-de/lib.../ff196148.aspx
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DavidKlimas

Registriert seit: 24. Sep 2006
Ort: Arlon, Belgien
71 Beiträge
 
#3

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 13:43
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 13:47
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DavidKlimas

Registriert seit: 24. Sep 2006
Ort: Arlon, Belgien
71 Beiträge
 
#5

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 13:55
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:
  ...
  AdoTable1.FieldByName(Str1).Value
  ...
Mein AdoTable wird dynamisch geladen, ich hab also keine Komponente oder AdoQuery.

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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#6

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 16:09
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 17:33
Hallo,
hier steht was dazu

http://forums.devshed.com/delphi-pro...le-940196.html
ziemlich weit unten (AdoTable.SQL.Add)

oder hier
https://stackoverflow.com/questions/...able-in-delphi
ganz unten
Heiko

Geändert von hoika (15. Aug 2018 um 17:36 Uhr)
  Mit Zitat antworten Zitat
DavidKlimas

Registriert seit: 24. Sep 2006
Ort: Arlon, Belgien
71 Beiträge
 
#8

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 18:16
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;

Geändert von DavidKlimas (15. Aug 2018 um 18:18 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 18:37
Hallo,
ja, siehe auch mein 2. Link.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#10

AW: Einfügen eines neues Feldes in AdoTable

  Alt 15. Aug 2018, 20:27
AdoQuery.Connection := AdoTable1.Connection;

Und ein paar Ressourcenschutzblöcke können nie schaden. (Try-Finally ab Create bis Free)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz