Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Neue Tabelle erstellen und öffnen (https://www.delphipraxis.net/128990-neue-tabelle-erstellen-und-oeffnen.html)

Thomas F 10. Feb 2009 20:07

Datenbank: Access • Zugriff über: ADO

Neue Tabelle erstellen und öffnen
 
Ich wollte eine neue Tabelle in meiner Datenbank erstellen und dann sofort öffnen(enthält noch keine Daten)
Dazu folgender Code
Man gibt in ein Edit1 den Namen der Tabelle ein und auf Button1click wird die Tabelle (Tabelle2) erstellt,
während bereits eine Tabelle (Tabelle1) geöffnet ist
Allerdings bekomme ich danach immer eine Fehlermeldung, dass die Tabelle nicht existiert.
Wenn ich danach in das Verzeichnis der Tabellen schaue (Combobox1) ,dann existiert die neue Tabelle und ich kann die Tabelle2 auch ohne Fehlermeldung öffnen.

Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var Tabellenname:string;
begin

if Edit1.text <> '' then
begin
  Tabellenname:= Edit1.Text;
unit1.form1.adoconnection1.ConnectionString:=Unit1.form1.ADOTable1.ConnectionString;
unit1.form1.ADOConnection1.Execute('CREATE TABLE '+Tabellenname+' (Nr COUNTER NOT NULL PRIMARY KEY,Feld1 varchar(60),Feld2 varchar(60),Feld3 varchar(5),Datum DATE,Feld5 varchar(40))');
 Unit1.form1.adotable1.Close;
unit1.Form1.ADOTable1.TableName:=tabellenname;
 Unit1.form1.adotable1.open;
close;
 end;

end;

Bernhard Geyer 10. Feb 2009 20:45

Re: Neue Tabelle erstellen und öffnen
 
Schließe mal die Connection nach dem Erzeugen. Access hat ein teilweise bescheuertes Cachingverhalten welches sowas verursachen könnte.

Thomas F 10. Feb 2009 20:53

Re: Neue Tabelle erstellen und öffnen
 
Zitat:

Zitat von Bernhard Geyer
Schließe mal die Connection nach dem Erzeugen. Access hat ein teilweise bescheuertes Cachingverhalten welches sowas verursachen könnte.

geht leider auch nicht, ich habs probiert

Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var Tabellenname:string;
begin

if Edit1.text <> '' then
begin
  Tabellenname:= Edit1.Text;
unit1.form1.adoconnection1.ConnectionString:=Unit1.form1.ADOTable1.ConnectionString;
unit1.form1.ADOConnection1.Execute('CREATE TABLE '+Tabellenname+' (Nr COUNTER NOT NULL PRIMARY KEY,Feld1 varchar(60),Feld2 varchar(60),Feld3 varchar(5),Datum DATE,Feld5 varchar(40))');
  unit1.form1.ADOConnection1.Close; //<----------
Unit1.form1.adotable1.Close;
unit1.Form1.ADOTable1.TableName:=tabellenname;
unit1.form1.ADOConnection1.open;
Unit1.form1.adotable1.open;
close;
end;

end;
[/delphi]

blawen 10. Feb 2009 20:58

Re: Neue Tabelle erstellen und öffnen
 
Hast Du Dir den erzeugten SQL-Befehl mal ausgeben lassen und hast Du ihn mit einem ext. DB-Tool überprüft?

Ev. musst Du den Tabellennamen in "" einklammern?

Thomas F 10. Feb 2009 21:01

Re: Neue Tabelle erstellen und öffnen
 
Seltsam, ich hab nur zum Testen einen 2.Button hinzugefügt, und öffne die neue Tabelle mit Buttonclick
Dann gehts
Offenbar ist die Tabelle noch nicht erstellt, wenn sie geöffnet wird :shock:

Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var Tabellenname:string;
begin

if Edit1.text <> '' then
begin
  Tabellenname:= Edit1.Text;
unit1.form1.adoconnection1.ConnectionString:=Unit1.form1.ADOTable1.ConnectionString;
unit1.form1.ADOConnection1.Execute('CREATE TABLE '+Tabellenname+' (Nr COUNTER NOT NULL PRIMARY KEY,Feld1 varchar(60),Feld2 varchar(60),Feld3 varchar(5),Datum DATE,Feld5 varchar(40))');
Unit1.form1.adotable1.Close;
unit1.Form1.ADOTable1.TableName:=tabellenname;

close;
end;

end;


procedure TForm1.Button2Click(Sender: TObject);//2.Button
begin

 adotable1.open; //funktioniert
end;

globetrotter77 10. Feb 2009 21:50

Re: Neue Tabelle erstellen und öffnen
 
Dein ADOTable bezieht sich vermutlich auch auf Form5 und nicht auf Form1.
Zumindest bei den Buttons ist das offenbar so, sonst würde es nicht
---> procedure TForm5.Button1Click(Sender: TObject);
heißen
Die Referenzierung mit "unit1.form1." mal rausnehmen, dann müsste sich alles auf das aktuelle Formular beziehen.

Thomas F 10. Feb 2009 22:05

Re: Neue Tabelle erstellen und öffnen
 
Zitat:

Zitat von globetrotter77
Dein ADOTable bezieht sich vermutlich auch auf Form5 und nicht auf Form1.
Zumindest bei den Buttons ist das offenbar so, sonst würde es nicht
---> procedure TForm5.Button1Click(Sender: TObject);
heißen
Die Referenzierung mit "unit1.form1." mal rausnehmen, dann müsste sich alles auf das aktuelle Formular beziehen.

ADO und die DBGird befindet sich auf dem Form1, von dort klickt man auf "Neue Tabelle" , dann öffnet sich Form5,
wo man in das Edit1 den Tabellennamen eingibt, und mit Button1.click die Tabelle erstellt.
Problem ist, dass die Tabelle noch nicht erstellt ist, wenn sie geöffnet wird.
Dann kommt die Fehlermeldung.

globetrotter77 10. Feb 2009 22:32

Re: Neue Tabelle erstellen und öffnen
 
und wie findet dann Button2 die passende Tabelle???
Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);//2.Button
begin

adotable1.open; //funktioniert
end;

Thomas F 11. Feb 2009 07:24

Re: Neue Tabelle erstellen und öffnen
 
Zitat:

Zitat von globetrotter77
und wie findet dann Button2 die passende Tabelle???
Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);//2.Button
begin

adotable1.open; //funktioniert
end;

Ja, da hab ich einen Fehler gemacht, es muß TForm1.Button2Click heissen.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);//2.Button
begin

adotable1.open; //funktioniert
end;

nahpets 11. Feb 2009 08:52

Re: Neue Tabelle erstellen und öffnen
 
Hallo,

falls das Problem noch nicht weg sein sollte, versuche mal bitte folgendes:
Delphi-Quellcode:
  unit1.form1.ADOConnection1.Close; //<---------- 
Unit1.form1.adotable1.Close;
ShowMessage('****');
unit1.Form1.ADOTable1.TableName:=tabellenname;
unit1.form1.ADOConnection1.open;
Unit1.form1.adotable1.open;
Dadurch wird eine mehr oder weniger von Dir beeinflussbare Pause eingebaut. Wenn es damit funktioniert, bist Du im Programmablauf zu schnell und "überholst" quasi die Datenbank. Um das Problem zu lösen könntest Du anstelle von ShowMessage ein Sleep(1000) einbauen. Den Wert 1000 musst Du eventuell anpassen. Eine "brutalere" Möglichkeit könnte in etwa so aussehen:
Delphi-Quellcode:
var
      i : Integer;
...
  Unit1.form1.adotable1.Close;
  unit1.Form1.ADOTable1.TableName:=tabellenname;
  unit1.form1.ADOConnection1.open;
  i := 0;
  repeat
    inc(i);
    Try
      Unit1.form1.adotable1.open;
    Except
    End;
  until Unit1.form1.adotable1.Active or (i >= 3); // maximal drei Versuche starten
  if Not Unit1.form1.adotable1.Active then begin
    // Behandlung der Situation, dass die Tabelle nach dem 3. Versuch nicht zu öffnen ist.
    ShowMessage('Die Tabelle ' + tabellenname + ' konnte nicht geöffnet werden.');
  end;
Über die "Eleganz" dieser Lösung wollen wir uns lieber nicht unterhalten :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Seite 1 von 3  1 23      

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