Announcement

Collapse
No announcement yet.

MSDE - Neue Datenbank erstellen ohne Tools...

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

  • MSDE - Neue Datenbank erstellen ohne Tools...

    Hallo,

    ich habe bis jetzt erste Erfahrungen nur mit einer Evaluation-Version von MS SQL-Server 2000 gemacht. Dort habe ich eine leere Datenbank im Enterprise-Manager angelegt, ebenso einen Benutzer, Passwort usw.

    Ich möchte nun MSDE benutzen. Dazu gibt es ja wohl keine Tools wie z.B. den Enterprise-Manager. Wie lege ich denn dort eine neue Datenbank an bzw. einen Benutzer und vergebe die Rechte für die Datenbank?

    Wie man die Tabellen über ADO erstellt, ist mir dann schon klar.

    Danke im voraus... Felix

  • #2
    Hallo,

    >Wie lege ich denn dort eine neue Datenbank ...

    Oh - da gibt es sehr viele Möglichenkeiten: <br>
    a) Das MSDE-Tool <i>osql.exe</i> führt ein Script mit CREATE DATABASE-Anweisungen aus <br>
    b) Ein eigenes Programm (Bsp: Delphi) greift über SQLDMO zu und führt dort über einen <i>Execute</i>-Aufruf ein SQL-Script mit der CREATE DATEBASE-Anweisung aus <br>
    c) Ein eigenes Programm (Bsp: Delphi) greift über SQLDMO zu, um die Datenbank "objektorientiert" anzulegen.

    Das folgende Beispiel für den Weg c) stammt aus meinem Buch <i>ADO und Delphi</i>:
    <pre>
    <font color="#003399"><i>{ ************************************************** **************
    Typ : Hauptformular
    Autor : Andreas Kosch
    Compiler : Delphi 5 Enterprise
    Betriebssystem : Windows 98
    Begonnen am : 12.11.1999
    Beschreibung : Mit SQLDMO auf der MSDE eine neue Datenbank erzeugen.
    ************************************************** ************** }</i></font>

    <b>unit</b> CreateDBFrm;

    <b>interface</b>

    <b>uses</b>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB, ComCtrls, StdCtrls;

    <b>type</b>
    TForm1 = <b>class</b>(TForm)
    Label1: TLabel;
    ButtonStart: TButton;
    Label3: TLabel;
    ButtonStop: TButton;
    StatusBar1: TStatusBar;
    ButtonLoad: TButton;
    ListBoxLog: TListBox;
    EditDBName: TEdit;
    <b>procedure</b> ButtonStartClick(Sender: TObject);
    <b>procedure</b> ButtonStopClick(Sender: TObject);
    <b>procedure</b> ButtonLoadClick(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private declarations }</i></font>
    aSrv : Variant;
    <b>procedure</b> MakeDatabase;
    <b>public</b>
    <font color="#003399"><i>{ Public declarations }</i></font>
    <b>end</b>;

    <b>var</b>
    Form1: TForm1;

    <b>implementation</b>

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

    <b>uses</b>
    <font color="#003399"><i>// Typbibliothek Microsoft SQLDMO Object Library einbinden</i></font>
    ComObj, ActiveX, SQLDMO_TLB;

    <b>procedure</b> TForm1.ButtonStartClick(Sender: TObject);
    <b>begin</b>
    aSrv := CreateOleObject(<font color="#9933CC">'SQLDMO.SQLServer'</font>);
    aSrv.LoginTimeout := 20;
    aSrv.Start(True, <font color="#9933CC">'(local)'</font>, <font color="#9933CC">'sa'</font>, <font color="#9933CC">''</font>);
    <b>end</b>;

    <b>procedure</b> TForm1.ButtonStopClick(Sender: TObject);
    <b>begin</b>
    aSrv.Disconnect;
    aSrv.Stop;
    <b>end</b>;

    <b>procedure</b> TForm1.ButtonLoadClick(Sender: TObject);
    <b>begin</b>
    MakeDatabase;
    ShowMessage(<font color="#9933CC">'Die Datenbank steht zur Verfügung'</font>);
    <b>end</b>;

    <b>procedure</b> TForm1.MakeDatabase;
    <b>resourcestring</b>
    cTABLENAME = <font color="#9933CC">'KUNDEN'</font>;
    cDBPATH = <font color="#9933CC">'C:\MSSQL7\Data\%s.mdf'</font>;
    cLOGPATH = <font color="#9933CC">'C:\MSSQL7\Data\%s.ldf'</font>;
    <b>var</b>
    aDB : _Database;
    dbFile : _DBFile;
    logFile : _LogFile;
    aMSDE : _SQLServer;
    aTable : _Table;
    aFirmaCol : _Column;
    aOrtCol : _Column;
    aReklaCol : _Column;
    aMemoCol : _Column;
    aPK : _Key;
    <b>begin</b>
    <font color="#003399"><i>// Schritt 1: Verbindung zur MSDE aufbauen</i></font>
    ListBoxLog.Items.Add(<font color="#9933CC">'Versuche Connect ....'</font>);
    aMSDE := CoSQLServer.Create;
    aMSDE.Connect(<font color="#9933CC">'(local)'</font>, <font color="#9933CC">'sa'</font>, <font color="#9933CC">''</font>);
    ListBoxLog.Items.Add(<font color="#9933CC">'...Connect ist ok!'</font>);
    <font color="#003399"><i>// Schritt 2: Prüfen, ob die Datenbank bereits vorhanden ist</i></font>
    <b>try</b>
    aDB := aMSDE.Databases.Item(EditDBName.Text, <font color="#9933CC">''</font>);
    ListBoxLog.Items.Add(<font color="#9933CC">'Datenbank ist vorhanden'</font>);
    <b>except</b>
    aDB := <b>nil</b>;
    <b>end</b>;
    <b>if</b> <b>not</b> Assigned (aDB) <b>then</b>
    <b>begin</b>
    <font color="#003399"><i>// Schritt 3: Datenbank erzeugen</i></font>
    ListBoxLog.Items.Add(<font color="#9933CC">'Datenbank wird neu erzeugt....'</font>);
    aDB := CoDatabase.Create;
    aDB.Name := EditDBName.Text;
    dbFile := CoDBFile.Create;
    logFile := CoLogFile.Create;
    <font color="#003399"><i>// PRIMARY Datenbankdatei</i></font>
    dbFile.Name := EditDBName.Text;
    dbFile.PhysicalName := Format(cDBPATH, [EditDBName.Text]);
    dbFile.PrimaryFile := True;
    dbFile.FileGrowthType := SQLDMOGrowth_MB;
    dbFile.FileGrowth := 1;
    aDB.FileGroups.Item(<font color="#9933CC">'PRIMARY'</font>).DBFiles.Add (dbFile);
    <font color="#003399"><i>// Log-Datei.</i></font>
    logFile.Name := EditDBName.Text + <font color="#9933CC">'log'</font>;
    logFile.PhysicalName := Format(cLOGPATH, [EditDBName.Text]);
    aDB.TransactionLog.LogFiles.Add(logFile);
    aMSDE.Databases.Add(aDB);
    ListBoxLog.Items.Add(<font color="#9933CC">'... Datenbank ist ok!'</font>);
    <b>end</b>;
    <font color="#003399"><i>// Schritt 4: Prüfen, ob die Tabelle bereits vorhanden ist</i></font>
    <b>try</b>
    aTable := aDB.Tables.Item(cTABLENAME, <font color="#9933CC">''</font>);
    ListBoxLog.Items.Add(<font color="#9933CC">'Tabelle ist vorhanden.'</font>);
    <b>except</b>
    aTable := <b>Nil</b>
    <b>end</b>;
    <b>if</b> <b>not</b> Assigned(aTable) <b>then</b>
    <b>begin</b>
    <font color="#003399"><i>// Schritt 5: Tabelle neu anlegen</i></font>
    ListBoxLog.Items.Add(<font color="#9933CC">'Tabelle wird neu angelegt....'</font>);
    aTable := CoTable.Create;
    aPK := CoKey.Create;
    <font color="#003399"><i>// Tabellenspalten-Objekte erzeugen</i></font>
    aFirmaCol := CoColumn.Create;
    aMemoCol := CoColumn.Create;
    aOrtCol := CoColumn.Create;
    aReklaCol := CoColumn.Create;
    <font color="#003399"><i>// Firma</i></font>
    aFirmaCol.Name := <font color="#9933CC">'Firma'</font>;
    aFirmaCol.DataType := <font color="#9933CC">'varchar'</font>;
    aFirmaCol.Length := 20;
    aFirmaCol.AllowNulls := False;
    <font color="#003399"><i>// Ort</i></font>
    aOrtCol.Name := <font color="#9933CC">'Ort'</font>;
    aOrtCol.DataType := <font color="#9933CC">'varchar'</font>;
    aOrtCol.Length := 20;
    aOrtCol.AllowNulls := False;
    <font color="#003399"><i>// Memo</i></font>
    aMemoCol.Name := <font color="#9933CC">'Hinweise'</font>;
    aMemoCol.DataType := <font color="#9933CC">'text'</font>;
    aMemoCol.AllowNulls := True;
    <font color="#003399"><i>// Reklamationen</i></font>
    aReklaCol.Name := <font color="#9933CC">'Rekla'</font>;
    aReklaCol.Datatype := <font color="#9933CC">'int'</font>;
    aReklaCol.AllowNulls := False;
    <font color="#003399"><i>// Tabelle definieren</i></font>
    aTable.Name := cTABLENAME;
    aTable.FileGroup := <font color="#9933CC">'PRIMARY'</font>;
    aTable.Columns.Add(aFirmaCol);
    aTable.Columns.Add(aOrtCol);
    aTable.Columns.Add(aMemoCol);
    aTable.Columns.Add(aReklaCol);
    <font color="#003399"><i>// Primärschlüssel festlegen</i></font>
    aPK.Clustered := True;
    aPK.Type_ := SQLDMOKey_Primary;
    aPK.KeyColumns.Add (<font color="#9933CC">'Firma'</font>);
    aTable.Keys.Add (aPK);
    <font color="#003399"><i>// Tabelle erzeugen</i></font>
    aDB.Tables.Add(aTable);
    ListBoxLog.Items.Add(<font color="#9933CC">'.... Tabelle ist ok!'</font>);
    <b>end</b>
    <b>end</b>;

    <b>end</b>.

    </pre&gt

    Comment


    • #3
      Danke Herr Kosch,

      na dann wird es wohl das einfachste sein, wenn ich mir das ADO-Buch kaufe ;-) Wird heute noch erledigt.

      Gruß Feli

      Comment


      • #4
        Leider muss ich noch mal nachfragen: ich habe massive Probleme, die SQLMDO einzubinden.

        Beim Import mit der Option Installieren/Komponentenwrapper erzeugen hängt sich Delphi auf, wenn ich nur "Unit erzeugen" wähle, funktioniert das zunächst.

        Beim Compilieren Ihres Beispieles erhalte ich aber gleich den Fehler:<br>
        "Identifier redeclared: ID" in dieser Zeile:<br>
        <pre>property ID: Integer readonly dispid 10;</pre>

        Das Auskommentieren dieser Zeile ermöglicht das Compilieren.
        Gibt es eventuell ein Versionsproblem? (Delphi7, Windows XP, MSDE-Installation datiert vom 22.8.2000).

        Wenn ich Ihr Beispiel dann laufen lasse, erhalte ich diesen Fehler:

        <pre>
        ---------------------------
        Datenbankerstellen
        ---------------------------
        [Microsoft][ODBC SQL Server Driver][SQL Server]Fehler bei der Anmeldung für den Benutzer 'sa'. Ursache: Keiner vertrauten SQL Server-Verbindung zugeordnet.
        ---------------------------
        OK
        ---------------------------
        </pre>

        Vielleicht muss ich doch <b>vor</b> dem Fragen Ihr Buch lesen ;-)

        Gruß Feli

        Comment


        • #5
          Hallo,

          &gt;Gibt es eventuell ein Versionsproblem?

          Es gab bisher noch keine Delphi-Version (3,4,5,6,7), die eine beliebige Typbibliothek fehlerfrei importieren konnte :-(

          &gt;Das Auskommentieren dieser Zeile ermöglicht das Compilieren.

          Das ist der "offizielle" Weg, um die beim Import von Delphi gemachten Fehler auszumerzen.

          &gt;Fehler bei der Anmeldung für den Benutzer 'sa'

          Der Microsoft SQL Server und somit auch die MSDE unterstützen zwei Betriebsarten für den Verbindungsaufbau durch einen Client: <br>
          a) Nur Windows-Authentifizierung (automatische Anmeldung, Benutername und Passwort sind nicht erlaubt), <br>
          b) Gemischte Anmeldung (Windows-Authentifizierung <b>oder</b> Benutzername/Passwort) <br>
          In meinem Beispiel gehe ich davon aus, dass die MSDE im Modus b) betrieben wird und somit der Zugriff über den Benutzernamen "sa" und <b>keinem</b> Passwort für diesen Benutzer erlaubt ist.

          Wenn die eigene MSDE allerdings nur den Weg a) unterstützt, muss der Zugriff wie folgt geändert werden (ich gehe dabei davon aus, dass der Benutzer Administrator-Rechte an diesem Rechner hat):
          <pre>

          <b>uses</b> ComObj;

          <b>procedure</b> TForm1.Button1Click(Sender: TObject);
          <b>var</b>
          aSrv : OleVariant;
          <b>begin</b>
          aSrv := CreateOleObject(<font color="#9933CC">'SQLDMO.SQLServer'</font>);
          aSrv.LoginSecure := True;
          aSrv.Connect(<font color="#9933CC">'(local)'</font>);
          ShowMessage(<font color="#9933CC">'Verbindungsaufbau zur lokalen MSDE war erfolgreich'</font>);
          <b>end</b>;

          </pre>
          Die Eigenschaft <b>LoginSecure</b> fordert die Windows-Authentifizierung an, während die Methode <b>Connect</b> die Verbindung herstellt

          Comment


          • #6
            Vielen herzlichen Dank. Konnte alles nachvollziehen und bin jetzt in der Lage, das selber fortzuführen.

            Beste Grüße

            Feli

            Comment


            • #7
              -> Andreas Kosch

              // Typbibliothek Microsoft SQLDMO Object Library einbinden
              ComObj, ActiveX, SQLDMO_TLB;

              Hallo,

              gibt es ein SDK für SQL Server Typenbibliotheken ? Würde es Probleme geben, wenn bereits die ADOX - Typenbiblotheken verwendet werden ?

              Gruß
              Mathia

              Comment


              • #8
                Hallo,

                das SQLDMO-Objektmodell hat nichts mit ADO/ADOX/JRO zu tun, sondern wird von den separaten COM-Objekten des MS SQL Server bzw. der MSDE zur Verfügung gestellt. Daher wird man die Typbibliothek mindestens einmal importieren müssen, wenn die frühe Bindung genutzt werden soll.

                &gt;..gibt es ein SDK ....

                Die Dokumentation ist in die <i>Microsoft Platform SDK</i>-Hilfe bzw. in die <i>MSDN Library</i>-DVD integriert.

                Microsoft stellt in dem Artikel <b>INF: Enabling SQL DMO Clients Without Installing the Client Side</b> einen Weg zur Verfügung, wie die SQLDMO-Objekte verfügbar gemacht werden können, <b>ohne</b> den "offiziellen" MS SQL Server-Client bzw. die MSDE zu installieren: http://support.microsoft.com/?id=24824

                Comment


                • #9
                  Hallo, <br>
                  für die MSDE und für den SQL2000 gibt es für wenig Geld unter <br>
                  www.msde.biz ein schönes Administrationstool.<p>
                  Gruss<br>
                  <pre>
                  Dietmar
                  </pre&gt

                  Comment

                  Working...
                  X