Announcement

Collapse
No announcement yet.

Access-Datenbank Erstellen (D 5.x)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Access-Datenbank Erstellen (D 5.x)

    Hallo!

    Wie kann ich eine Access-Datenbank via Delphi erstellen?!?
    DataModule -> TDatabase -> TDataSet -> TQuery
    Ich überprüfe 'OnCreate' ob eine Datenbank vorhanden ist und möchte bei Nichvorhandensein eine Datenbank in ein "User-Dir" erstellen - nur bekomme ich das einfach nicht hin...
    Kann mir jemand ein CodeBeispiel posten - DANKE !!!


  • #2
    Hallo,

    das folgende Beispiel für das Erzeugen einer neuen ACCESS-Datenbank stammt aus meinem Buch <i>ADO und Delphi</i>. Das Programm nutzt die <i>ADO Extension for Data Definition Language and Security</i> (ADOX), so dass diese Typbiblithek in Delphi importiert und eingebunden (<i>uses ADOX_TLB</i>) werden muss:
    <pre>
    <font color="#003399"><i>{ ************************************************** **************
    Typ : Hauptformular-Unit
    Autor : Andreas Kosch
    Erstellt am : 29.01.2000
    Compiler : Delphi 5.01 UpdatePack #1
    Betriebssystem : Windows NT 2000 und MDAC 2.5
    Beschreibung : Demonstriert das Erzeugen einer neuen
    ACCESS-Datenbank und einer neuen Tabelle
    über die ADOX-Objekte.
    Revisionen : 15.09.2000 Test mit D5UP1
    10.12.2001 Test mit Delphi 6.01 unter Windows XP
    ************************************************** ************** }</i></font>

    <b>unit</b> Newmdb2Frm;

    <b>interface</b>

    <b>uses</b>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ComObj, ComCtrls;

    <b>type</b>
    TFormMain = <b>class</b>(TForm)
    MemoLog: TMemo;
    StatusBar1: TStatusBar;
    EditMDB: TEdit;
    Label1: TLabel;
    Button1: TButton;
    <b>procedure</b> Button1Click(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private declarations }</i></font>
    <b>public</b>
    <font color="#003399"><i>{ Public declarations }</i></font>
    <b>end</b>;

    <b>var</b>
    FormMain: TFormMain;

    <b>implementation</b>

    <font color="#003399"><i>{$R *.DFM}</i></font>

    <b>uses</b> ADOX_TLB;

    <b>resourcestring</b>
    cCONNECTSTRING = <font color="#9933CC">'Provider=Microsoft.Jet.OLEDB.4.0; Data Source='</font>;

    <b>procedure</b> TFormMain.Button1Click(Sender: TObject);
    <b>var</b>
    aCatalog : _Catalog;
    aTable : _Table;
    aColumn : _Column;
    sDBPath : <b>String</b>;
    sDS : <b>String</b>;
    vColName : OleVariant;
    <b>begin</b>
    MemoLog.Lines.Clear;
    sDBPath := EditMDB.Text;
    <b>if</b> FileExists(sDBPath) <b>then</b>
    <b>begin</b>
    DeleteFile(sDBPath);
    MemoLog.Lines.Add(Format(<font color="#9933CC">'Datenbankdatei %s gelöscht'</font>,[sDBPath]));
    <b>end</b>;
    aCatalog := CoCatalog.Create;
    MemoLog.Lines.Add(<font color="#9933CC">'Catalog...'</font>);
    sDS := aCatalog.Create(Format(<font color="#9933CC">'%s%s'</font>,[cCONNECTSTRING, sDBPath]));
    MemoLog.Lines.Add(sDS);
    aTable := CoTable.Create;
    MemoLog.Lines.Add(<font color="#9933CC">'Table...'</font>);
    aTable.ParentCatalog := aCatalog;
    aTable.Name := <font color="#9933CC">'Kunden'</font>;

    <font color="#003399"><i>// Spalte 1</i></font>
    aColumn := CoColumn.Create;
    <b>with</b> aColumn <b>do</b>
    <b>begin</b>
    ParentCatalog := aCatalog;
    Name := <font color="#9933CC">'KdnName'</font>;
    Type_ := adVarWChar;
    DefinedSize := 30;
    Properties[<font color="#9933CC">'Description'</font>].Value := <font color="#9933CC">'Name des Kunden'</font>;
    Properties[<font color="#9933CC">'Nullable'</font>].Value := False;
    <b>end</b>;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add(<font color="#9933CC">'Spalte 1 hinzugefügt...'</font>);

    <font color="#003399"><i>// Spalte 2 = Zeichenfeld mit &quot;Erforderlich = Nein&quot;</i></font>
    aColumn := CoColumn.Create;
    <b>with</b> aColumn <b>do</b>
    <b>begin</b>
    ParentCatalog := aCatalog;
    Name := <font color="#9933CC">'Telefon'</font>;
    Type_ := adVarWChar;
    DefinedSize := 15;
    Properties[<font color="#9933CC">'Description'</font>].Value := <font color="#9933CC">'Telefonnummer des Kunden'</font>;
    Properties[<font color="#9933CC">'Nullable'</font>].Value := True;
    <b>end</b>;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add(<font color="#9933CC">'Spalte 2 hinzugefügt...'</font>);

    <font color="#003399"><i>// Tabelle hinzufügen</i></font>
    aCatalog.Tables.Append(aTable);
    MemoLog.Lines.Add(<font color="#9933CC">'.... Fertig!'</font>);
    <b>end</b>;

    <b>end</b>.

    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch

      Kann man eine Access DB auch mit einer ADOConnection erstellen??

      MFG Ni

      Comment


      • #4
        Hallo,

        meines Wissens nach gibt es in den <i>Microsoft Jet 4.0 ANSI SQL-92 Extensions</i> keine CREATE DATABASE-Anweisung. Daher muss die Datenbank selbst (*.MDB) über ADOX erzeugt werden. Danach kann es mit CREATE TABLE usw. direkt über das Connection-Objekt von ADO weitergehen, wenn man die Tabellen der Datenbank nicht über ADOX anlegen möchte

        Comment


        • #5
          Sehr geehrter Herr Kosch !

          Ich bin umsteiger von VB6 -> Delphi 7 ( personal zur Zeit ). Ursprunglich habe ich Vermessungsprogramm entwickelt, der auf MDB über DAO zugreift. Jetzt habe ich im Delphi eigene CAD-Application entwickelt und möchte auf MDB Daten zugreifen.

          Frage: bin ich am richtigen weg ? Kann mir Ihre Buch 'ADO und Delphi' dabei helfen.

          Ich befinde mich momentan im Delphi Testphase und daswegen benutze ich Personal Edition. Im delphi-forum habe ich Info bekommen dass auch mit Personal Edition Datenbankzugriff möglich ist.

          Danke für Antwort,

          Miroslav Marekovi

          Comment


          • #6
            > Frage: bin ich am richtigen weg ? Kann mir Ihre Buch 'ADO und Delphi' dabei helfen.

            Ist ein guter Einstieg

            > Im delphi-forum habe ich Info bekommen dass auch mit Personal Edition Datenbankzugriff möglich ist.

            Ist möglich, jedoch nur auf die native ADO-Objekte. Es sind aber keine Datensensitiven Komponenten bzw. Dataset-Komponenten vorhanden. Diese vereinfachen (für Einsteiger) die ersten Entwicklungsschritte mit Datenbanken. Sind aber nicht zwangsläufig notwendig

            Comment


            • #7
              Bin soweit um Datenbank zu verbinden:

              aCon := CoConnection.Create;
              aCon.Open(ConnectStr, '', '', adConnectUnspecified);

              wie kann ich jetzt tabelle ( mit index ) öffnen und einträge durchsuchen ?

              Danke für die hilfe

              Comment


              • #8
                Hallo,

                das folgende Beispiel zeigt die Daten der Spalten aller Datensätze in einem TStringGrid visuell an:
                <pre>
                <b>procedure</b> TForm1.Button1Click(Sender: TObject);
                <b>var</b>
                aCon : _Connection;
                aRS : _Recordset;
                iRow, iCol : Integer;
                <b>begin</b>
                aCon := CoConnection.Create;
                aCon.Open(cCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adConnectUnspecified);
                <b>try</b>
                aRS := CoRecordset.Create;
                aRS.CursorLocation := adUseClient;
                aRS.Open(<font color="#9933CC">'SELECT CustomerID,CompanyName,City FROM Customers'</font>,
                aCon, adOpenStatic, adLockReadOnly , 0);
                <b>try</b>
                StringGrid1.Cells[1, 0] := aRS.Fields[0].Name;
                StringGrid1.Cells[2, 0] := aRS.Fields[1].Name;
                StringGrid1.Cells[3, 0] := aRS.Fields[2].Name;
                iRow := 1;
                <b>while</b> <b>not</b> aRS.EOF <b>do</b> <b>begin</b>
                StringGrid1.Cells[0, iRow] := IntToStr(iRow);
                <b>for</b> iCol := 0 <b>to</b> 2 <b>do</b>
                StringGrid1.Cells[iCol + 1, iRow] :=
                aRS.Fields[iCol].Value;
                Inc(iRow);
                aRs.MoveNext
                <b>end</b>;
                <b>finally</b>
                aRS.Close;
                aRS := <b>nil</b>;
                <b>end</b>;
                <b>finally</b>
                aCon.Close;
                aCon := <b>nil</b>;
                <b>end</b>;
                <b>end</b>;</pre>
                Für die Verwaltung der Ergebnismenge einer SELECT-Abfrage auf die Datenbanktabelle ist das <b>Recordset</b>-Objekt zuständig. Über dessen <b>Fields</b>-Kollektion lassen sich alle Spalten eines Datensatzes abfrufen. Über die Methode <b>MoveNext</b> wird der Datensatzzeiger auf den nächsten Datensatz positioniert. Die Eigenschaft <b>EOF</b> kennzeichnet das Ende der Ergebnismenge

                Comment


                • #9
                  Hallo Herr Kosch !

                  Es funktioniert. Jetzt sind Feinheiten zu bewältigen - in Tabelle mittels Index suchen, NULL eintrage kontrollieren usw. Kann ich dass alles aus Ihren Buch lernen ?

                  Ich frage deswegen, weil überall finde ich ADO Beschreibungen aber in Verbindung mit Delphi Professional (Dataset-Komponenten) , was aber ich brauche ( wie Sie wissen ) ist zugriff über native ADO-Objekte.

                  Danke

                  M. Marekovi

                  Comment


                  • #10
                    Hallo,

                    &gt;.. überall finde ich ADO Beschreibungen aber in Verbindung mit Delphi Professional (Dataset-Komponenten)...

                    da gibt es keinen Unterschied ;-) <br>
                    Die ADO Express-Komponenten (dbGo) rufen in der Regel (bis auf ganz wenigen Ausnahmen) nur die originalen Microsoft-Objekte auf. Das folgende Beispiel aus dem ADO-Buch für das Suchen im Datenbestand demonstriert, dass man direkt auf die nativen Objekte zugreifen kann, so dass das folgende Beispiel auch ohne dbGo funktioniert:

                    <pre><b>procedure</b> TForm1.ButtonFindClick(Sender: TObject);
                    <b>begin</b>
                    FRSFind := ADODataSet1.Recordset;
                    FRSFind.Find(Format(<font color="#9933CC">'City = %s'</font>, [QuotedStr(EditLocate.Text)]),
                    0, adSearchForward, EmptyParam);
                    ADODataSet1.Resync([rmExact]);
                    <b>end</b>;
                    <br>
                    <b>procedure</b> TForm1.ButtonFindNextClick(Sender: TObject);
                    <b>begin</b>
                    FRSFind.Find(Format(<font color="#9933CC">'City = %s'</font>, [QuotedStr(EditLocate.Text)]),
                    1, adSearchForward, EmptyParam);
                    <b>if</b> FRSFind.EOF <b>then</b> <b>begin</b>
                    ShowMessage(<font color="#9933CC">'Keine weiteren Fundstellen'</font>);
                    FRSFind.MoveFirst;
                    <b>end</b>;
                    ADODataSet1.Resync([rmExact]);
                    <b>end</b>;</pre>
                    &gt;Kann ich dass alles aus Ihren Buch lernen ?

                    Im Buch werden die nativen ADO-Objekte gleichwertig behandelt. Bestimmte Funktionen lassen sich aufgrund der dbGo-Bugs auch nur mit den nativen Objekten fehlerfrei nutzen

                    Comment

                    Working...
                    X