Entwickler-Ecke

Datenbanken - Neue Access Datenbank anlegen


THF - Fr 30.01.09 12:02
Titel: Neue Access Datenbank anlegen
Hallo,

wie kann ich ohne BDE eine neue Access-Datenbank (z.B. Test.mdb) mit ADO anlegen ???
Ich hab das noch nie gemacht.


iKilledKenny - Fr 30.01.09 12:05

Ich glaube, das geht nicht. ADO ist eine Möglichkeit auf vorhandene Datenbanken zuzugreifen, nicht aber welche anzulegen.

Bitte korrigiert mich, wenn das anders ein sollte.


THF - Fr 30.01.09 12:08

user profile iconiKilledKenny hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube, das geht nicht. ADO ist eine Möglichkeit auf vorhandene Datenbanken zuzugreifen, nicht aber welche anzulegen.

Bitte korrigiert mich, wenn das anders ein sollte.


Also eine Datenbank mit BDE anlegen und dann mit ADO zugreifen ?


iKilledKenny - Fr 30.01.09 12:14

Also wenns drum geht, eine leere Access-DB mit einem Programm auszuliefern, so habe ich die DB immer als Resource mit im Programm gehabt und bei bedarf "entpackt".

Ansonsten halt mit Access anlegen.


THF - Fr 30.01.09 12:18

Hier stehts , ich werds mal ausprobieren

http://www.delphipraxis.net/topic17397_accesdb+mdb+anlegen+ohne+access.html&highlight=access+anlegen


THF - Fr 30.01.09 16:56

Ich hab jetzt die leere Access-Datenbank angelegt.
Hat funktioniert, da ich kein Access habe , geht es leider nicht anders.


Müßte jetzt nur noch wissen , wie ich jetzt eine Tabelle mit Spalten anlege.
Was muß ich bei ADOTable1.Tablename:= ........ eintragen ??


dummzeuch - Fr 30.01.09 21:59
Titel: Re: Neue Access Datenbank anlegen
user profile iconTHF hat folgendes geschrieben Zum zitierten Posting springen:
wie kann ich ohne BDE eine neue Access-Datenbank (z.B. Test.mdb) mit ADO anlegen ???


http://svn.berlios.de/wsvn/dzchart/utilities/dzLib/trunk/dbcreator/u_dzDbCreatorCreateAccess.pas

twm


Ydobon - Fr 30.01.09 22:09

Wenn man schon eine Datenbank hat, ist es eher zu empfehlen diese mit einer TADOConnection zu verbinden und per Execute ein 'CREATE TABLE Tabelle1 (Feld1 INTEGER, Feld2 TEXT(50)...' abzuschicken. Mit ADOX lässt sich zwar mehr einstellen, aber, wann braucht man das und SQL erspart den Schreibkrampf.


SmileySN - Fr 30.01.09 22:31

Das erstellen einer AccessDB und das erstellen einer Tabelle darin sieht folgendermaßen aus.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
//******************************************************************************
//********************** Datenbank erstellen ***********************************
//******************************************************************************
// Erstellt eine neue Access Datenbankdatei
// Aufruf mit DBError:=CreateDB(Pfad+DBName,True); //(DBError:String)
// DBName besteht aus Laufwerk+Pfad+Datenbankname
// (.mdb kann aber muss nicht angegeben werden)
// Der zweite Parameter sagt aus, ob eine vorhandene Datei überschrieben werden darf.
// Wird False angegeben, dann erzeugt eine vorhandene Datei einen Fehlertext.
Function CreateDB(DBName: String; DelIfExists: Boolean = False): String;
Var
  DBEngine, Workspace, Database: OleVariant;
  s, DBError                  : String;
Const
  dbLangGeneral               = ';LANGID=0x0409;';

  //____________________________________________________________________________
  Function DBAnlegen: String;
  Begin
    s := dbLangGeneral + 'CP=' + IntToStr(GetACP()) + ';COUNTRY=0';
    DBEngine := CreateOleObject('DAO.DBEngine.36');
    Try
      Try
        Workspace := DBEngine.Workspaces[0];
        Database := Workspace.CreateDatabase(DBName, s, 64);
        Database.Close;
        Workspace.Close;
        DBError := OpenDB(DBName);
        If DBError <> '' Then
          Result := DBError;
      Except
        On E: Exception Do
          Result := E.Message;
      End;
    Finally
      Database := NULL;
      Workspace := NULL;
      DBEngine := NULL;
    End;
  End;
  //____________________________________________________________________________

Begin
  Result := '';
  //  showmessage('------ '+DBName+' ------');
  If LowerCase(Copy(DBName, Length(DBName) - 34)) <> '.mdb' Then
    DBName := DBName + '.mdb';
  If FileExists(DBName) Then
    If DelIfExists Then
      Begin
        DeleteFile(PChar(DBName));
        Result := DBAnlegen;
      End
    Else
      Begin
        DBError := 'Datenbank existiert bereits, das löschen wurde verweigert';
        Result := DBError;
      End
  Else
    Result := DBAnlegen;
End;

//******************************************************************************
//********************** Tabelle erzeugen **************************************
//******************************************************************************
// Tabelle in der aktuellen Datenbank anlegen.
// Aufruf mit DBError:=CreateTable(Pfad+DBName,Tabellenname); //(DBError:String)
Function CreateTable(DBName, Tabelle: String): String;
Var
  cCreateData, s, DBError: String;

Begin
  // Hier Tabelle erstellen
  // Result := False wenn die Erstellung fehlgeschlagen ist
  cCreateData := 'CREATE TABLE ' + Tabelle + '('
    + 'ID Counter PRIMARY KEY,'
    + 'Name Varchar(30),'
    + 'Row integer,'
    + 'Col integer,'
    + 'Data Varchar(30),'
    + 'DataTyp Byte,'
    + 'FormatNr Byte,'
    + 'Format Varchar(20),'
    + 'Pre Varchar(10),'
    + 'Post Varchar(10));';

  s := OpenDB(DBName);
  if s='' then
  begin
    Con1.LoginPrompt := False;
    Con1.Open; // Datenbank aktivieren
    qryDat.Connection := Con1;
{
    Try
      // Vorhandene Tabelle löschen
      // Abfragen ob die Tabelle schon vorhanden ist, wenn ja dann Tabelle löschen
      qryDat.SQL.Text := 'Drop Table ' + Tabelle;
      qryDat.ExecSQL;
    Except
      //DBError:='Tabelle konnte nicht gelöscht werden';
    End;
}

    Try
      qryDat.SQL.Text := cCreateData; // Tabelle für Daten erzeugen
      qryDat.ExecSQL; // Da keine Daten zurückgegeben werden ExecSQL ausführen

      qryDat.SQL.Text := 'Create Index IxRow on ' + Tabelle + '(Row)'// Index Row erstellen
      qryDat.ExecSQL; // Da keine Daten zurückgegeben werden ExecSQL ausführen

      qryDat.SQL.Text := 'Create Index IxCol on ' + Tabelle + '(Col)'// Index Col erstellen
      qryDat.ExecSQL; // Da keine Daten zurückgegeben werden ExecSQL ausführen

      qryDat.SQL.Text := 'Select * From ' + Tabelle; // Daten-Tabelle Selektieren
      qryDat.Open; // Hier werden Daten zurückgegeben, daher open ausführen

      LastTable := Tabelle;
      Result := '';
    Except
      DBError := 'Tabelle konnte nicht angelegt werden';
      LastTable := '';
      Result := DBError;
    End;
  end;
End;