Rubrik: Datenbanken | VB-Versionen: VB5, VB6 | 01.06.04 |
Grundlagen: Arbeiten mit der kostenlosen MSDE-Datenbank von Microsoft Mit diesem Workshop möchten wir aufzeigen, wie eine MSDE-Datenbank installiert wird, Datenbanken und Tabellen hinzugefügt werden, und wie diese Datenbanken in VB6 Programmen verwendet werden können. | ||
Autor: Wolfgang Christ | Bewertung: | Views: 48.428 |
Mit diesem Workshop möchten wir aufzeigen, wie eine MSDE-Datenbank installiert wird, Datenbanken und Tabellen hinzugefügt werden, und wie diese Datenbanken in VB6 Programmen verwendet werden können.
Inhalt:
- Installation der MSDE
- Allgemeine Hinweise
- Anlegen und Löschen von Datenbanken
- Anlegen und Löschen von Tabellen, physisch
- Anlegen und Löschen von Tabellen, Abfragen (Views)
- Verwenden in VB6
1. Installation der MSDE
Laden Sie sich bei Micorsoft das MSDE Datenbank-Setup herunter. Die aktuellste Fassung findenSie hier:
http://www.microsoft.com/downloads/details.aspx?FamilyId=413744D1-A0BC-479F-BAFA-E4B278EB9147&displaylang=de
Entpacken Sie das Paket in einen Ordner Ihrer Wahl, standardmäßig ist "c:/sql2ksp3/" bzw. bei der deutschen Version "c:\MSDERelA" vorgegeben.
Wechseln sie auf der Kommandozeile von Windows (Start, Ausführen, "cmd") in diesen Ordner oder wechseln Sie über Start --> Programme --> Zubehör direkt in die Eingabeaufforderung und tippen Sie folgende Anweisungen ein:
cd\ cd sql2ksp3 ' (bzw. MSDERelA, je nachdem in welchem Ordner Sie ' das Setup gespeichert haben) cd msde ' (kann bei der deutschen Version unter Umständen entfallen, ' da ein solcher Ordner nicht existiert) setup SecurityMode= SQL SAPWD=IhrKennwort
wobei "IhrKennwort" für ein Kennwort Ihrer Wahl steht (ohne Leerzeichen).
Weitere wichtige Parameter
DISABLENETWORKPROTOCOLS=n | Gibt an, ob die MSDE Netzwerkverbindungen von Anwendungen zulassen soll, die auf anderen Computern ausgeführt werden. Standardmäßig, bzw. wenn Sie DISABLENTWORKPROTOCOL=1 angeben, konfiguriertdas Setupprogramm die MSDE so, dass Netzwerkverbindungen nicht zugelassen werden. Geben Sie DISABLENETWORKPROTOCOLS=0 an, um Netzwerkverbindungen zuermöglichen. |
DATADIR="Pfad_zum_Datenordner" | Gibt den Ordner an, in dem das Setupprogramm die Systemdatenbanken, Fehlerprotokolle und Installationsskriptsinstalliert. Der für Pfad_zum_Datenordner angegebene Wert muss mit einem umgekehrten Schrägstrich (\) enden. |
Das war auch schon alles für die Installation.
Zusätzliche Hinweise
Bei unseren Testinstallationen der MSDE ist zum Teil folgender Fall aufgetreten:
Es kann durchaus vorkommen kann, dass das Setup nach ca. 15 Minuten nicht mehr reagiert und sich mit einem entsprechenden Hinweis meldet. Hier sollte man auf "Abbrechen" klicken und das Setup sofort erneut ausführen. Danach klappt's dann i.a.R.
Sollten Sie über eine bereits bestehende Installation / Instanz der MSDE verfügen, so brauchen Sie zum durcharbeiten dieses Workshops das sa-Kennwort. Falls diese Instanz der MSDE nicht im Gemischten Zugriffsmodus läuft, so können Sie der unten aufgeführten Dokumentation eine genaue Anleitung entnehmen.
Weitergehende Informationen zur Installation der MSDE können Sie sich hier herunterladen (ca. 30 MB):
Microsoft SQL Server Online Book
oder hier:
Readme für die MSDE 2000A.
2. Allgemeine Hinweise
Die MSDE ist der kleine kostenlose Bruder des MS SQL Servers 2000, dieser besitzt aber im Vergleich zum großem Bruder keine Management Programme zur Verwaltung. Diese Verwaltung wird ausschließlich mit SQL-Befehlen erledigt. Zusätzlich hat eine MSDE Datenbank im Vergleich zu ihrem großem Bruder die Einschränkung, das die Anzahl der gleichzeitig möglichen Connections auf 10 beschränkt ist. Wollen Sie also eine sehr große Mehrbenutzeranwendung entwickeln, kommen Sie um den MS SQL Server nicht herum, sind es aber nur bis zu 10 Benutzer ist die MSDE durchaus zu empfehlen. Sonstige Einschränkungen sind nicht bekannt. Allerdings sollte erwähnt werden, dass eine laufende Instanz der MSDE durchaus - je nach Auslastung - Rechenleistung fordert.
Eine MSDE Installation kann mehrere Datenbanken verwalten. Diese unterscheiden sich in ihrem Namen. Es gibt allerdings 5 Namen, die nicht verwendet werden dürfen: Master, Pubs, Model, tempdb, msdb, da diese bereits verwendet werden. Diese Datenbanken dürfen wir auch nicht löschen.
Grundsätzlich unterscheidet eine MSDE Datenbank zwischen 2 Möglichkeiten des Zugriffs: Windows Anmeldeinformationen und SQL Server Anmeldung. Hier wird nur die SQL Sever Anmeldung demonstriert.
Wollen wir bestimmte Aktionen auslösen, müssen wir auch über entsprechende Rechte innerhalb des SQL Severs verfügen, das heißt der Nutzer mit dem wir angemeldet sind, muss über die benötigten "Rollen" verfügen. Darauf wollen wir in diesem kurzem Exkurs aber nicht eingehen, dies würde den Umfang einfach zu sehr sprengen. Der Einfachheit halber verwenden wir hier immer den Systemadministrator des SQL Servers, den Nutzer sa. Zusätzlich müssen wir immer zu einer bestehenden Datenbank verbunden sein. Von Anfang an existiert eine Master-Datenbank, die mit installiert wird.
Nachdem wir nun die MSDE installiert haben, finden wir im SYSTRAY ein kleines Icon mit einem Tower und einem Kreis. entweder mit einem grünem Pfeil, einem Pausezeichen oder einem Stop-Zeichen. Über dieses Systray-Symbol können wir die MSDE starten, stoppen und anhalten.
3. Anlegen und löschen von Datenbanken
Zuerst verbinden wir uns mit der Datenbank "Master". (Wie dies geht lesen Sie unter Punkt 6. Verwenden in VB6). Über eine geöffnete Connection können wir zum Anlegen der Datenbank folgenden Befehl verwenden:
CREATE DATABASE [{DATENBANKNAME}]
Zum Löschen von Datenbanken verwenden wir
DROP1 DATABASE [{DATENBANKNAME}]
{DATENBANKNAME} wird hierbei immer durch den gewünschten Namen ersetzt.
4. Anlegen und löschen von Tabellen
Um eine Tabelle anzulegen, müssen Sie sich mit der entsprechenden Datenbank verbinden. Über eine geöffnete Connection gestaltet sich der grundsätzliche Aufbau wie folgt:
CREATE TABLE [{TABELLENNAME}] ( {SPALTE}, {SPALTE} )
Dabei kann {TABELLENNAME} beliebig sein, und eine {SPALTE} ist wie folgt aufgebaut: auf jede Spalte (mit Ausnahme der letzten) folgt ein Komma.
{SPALTENAME}] [{DATENTYP}] ({LÄNGE}) [NULL|NOT NULL]
Dabei kann {SPALTENAME} beliebig sein, {DATENTYP} ein Element der folgenden Liste der möglichen verwendeten Datentypen. Bei den mit * markierten
Datentypen muss die Länge in Klammern dahinter angegeben werden:
bigint binary bit (:= Boolean) char* (nicht benutzte Zeichen werden mit Leerzeichen aufgefüllt) datetime decimal float image (:= memo Feld für Streams) int money numeric* nvarchar* real smalldatetime damllint sql_varaint text timestamp tinyint uniqueidentifier varbinary varchar* (nicht benutzte Zeichen werden nicht mit Leerzeichen aufgefüllt)
Zum Schluss muss noch angegeben werden ob NULL-Werte erlaubt sind oder nicht. Ein Autowert-Feld wird zusätzlich noch mit folgendem Schlüsselwort angelegt:
IDENTITY (1, 1)
Hier ein einfaches Bespiel für eine Tabelle "Kunden" mit einem Autowert, Name, Vorname, Straße, PLZ, Ort, Telefon, Kontaktanzahl:
CREATE TABLE [Kunden] ( [ID] [bigint] IDENTITY (1, 1) NOT NULL , [Name] [varchar] (50) NOT NULL, [Vorname] [varchar] (50) NULL, [Straße] [varchar] (50) NULL, [PLZ] [varchar] (8) NULL, [Ort] [varchar] (50) NULL, [Telefon] [varchar] (30) NULL, [Kontakte] [int] NULL)
Um Tabellen zu löschen verwenden Sie folgenden Befehl:
DROP TABLE [{TABELLENNAME}]
{TABELLENNAME} wird hierbei immer durch den Namen der zu löschenden Tabelle ersetzt.
5. Anlegen und Löschen von Tabellen, Abfragen (Views)
Gespeicherte Abfragen, auch Views genannt, werden wie folgt angelegt:
CREATE VIEW [{ABFRAGENAME}] AS {SELECT-STATEMENT}
{ABFRAGENAME} wird hierbei immer durch den Namen der entsprechenden Abfrage ersetzt und {SELECT-STATEMENT} durch eine feste SQL-Abfrage.
Gespeicherte Abfragen (Views), werden wie folgt gelöscht:
DROP VIEW [{ABFRAGENAME}]
{ABFRAGENAME} wird hierbei immer durch den Namen der entsprechenden Abfrage ersetzt.
Auf diese gespeicherten Abfragen kann wie auf eine Tabelle zugegriffen werden, mit dem Unterschied, dass hier kein Update durchgeführt werden kann.
6. Verwenden in VB6
Fügen Sie Ihrem Projekt einen Verweis auf Microsoft ActiveX Data Objects 2.7 Library hinzu. Deklarieren Sie in einem Modul oder innerhalb der gewünschten Sichtbarkeit ein Objekt vom Typ ADODB.Connection und fügen eine Funktion hinzu, die die Connection zur Datenbank öffnet. Wenn Sie beides in ein Modul packen, brauchen Sie für Ihre Anwendung nur eine Connection.
' Modul modADOConnection Public oConn as ADODB.Connection ' Datenbank öffnen Public Function OpenConnection(ByVal sServer As String, _ ByVal sDatabaseName As String, _ ByVal sUsername As String, _ ByVal sKennwort As String) As Boolean Dim p As String On Error GoTo ErrHandler If oConn Is Nothing Then Set oConn = New ADODB.Connection p = "Provider=SQLOLEDB.1;" p = p & "Initial Catalog=&" & sDataBaseName & ";" p = p & "Data Source=" & sServer & ";" p = p & "Persist Security Info=False;" p = p & "Connect Timeout=45" With oConn .CursorLocation = adUseClient .Open p, sUsername, sKennwort OpenConnection = True END WITH Exit Function End If ErrHandler: MsgBox "Es ist ein Fehler beim Öffnen der Datenbank aufgetreten." & _ vbCrLf & CStr(Err.Number) & " " & Err.Description End Function
Für Ihre erste Anmeldung und zum Anlegen einer neuen Datenbank, verbinden Sie sich mit der Datenbank Master. Befehle, die kein Recordset zurückgeben, können Sie mittels der Execute-Methode der Connection ausführen. z.B.:
oConn.Execute "CREATE DATABASE [TEST]" ' Anlegen einer Datenbank ' Anlegen der Tabelle Kunden Dim SQL As String SQL = "CREATE TABLE [Kunden] (" & _ "[ID] [bigint] IDENTITY (1, 1) NOT NULL , " & _ "[Name] [varchar] (50) NOT NULL, " & _ "[Vorname] [varchar] (50) NULL, " & _ "[Straße] [varchar] (50) NULL, " & _ "[PLZ] [varchar] (8) NULL, " & _ "[Ort] [varchar] (50) NULL, " & _ "[Telefon] [varchar] (30) NULL, " & _ "[Kontakte] [int] NULL)" oConn.Execute SQL
Möchten Sie nun eine Abfrage ausführen und ein Recordset erhalten, können Sie dies wie folgt tun:
Dim oRs As ADODB.Recordset Set oRs As ADODB.Recordset oRs.Open "SELECT * FROM Tabelle", oConn, adOpenDynamic, adOpenOptimistic
Hinzufügen von Datensätzen (nur auf physischen Tabellen möglich)
a) per SQL Insert Into - Anweisung
Ein Insert Into-Befehl beginnt immer mit dem Schlüsselwort INSERT INTO [{Tabellenname}]. Danach folgt eine geklammerte Folge aller Felder, die gefüllt werden sollen. Autowert-Felder dürfen dabei nicht aufgeführt werden. Für unser obiges Beispiel wäre das dann wie folgt:
SQL = "INSERT INTO [Kunden]
([Name],[Vorname],[Straße],[PLZ],[Ort],[Telefon],[Kontakte])"
Nun haben wir zwei Möglichkeiten:
- Aus einer bereits bestehenden Tabelle oder
- Zeile für Zeile.
aa) Aus einer bestehenden Tabelle:
In diesem Fall folgt nun ein SELECT Statement, das uns die vorher genannten Feldinhalte in der aufgeführten Reihenfolge zurückliefert.
SQL = SQL & " SELECT [Name],[Vorname],[Straße],[PLZ],[Ort],[Telefon],[Kontakte] FROM [Kunden2]" oConn.Execute SQL
ab) Zeile für Zeile
In diesem Fall folgt nun das Schlüsselwort VALUES, auf das wiederum eine geklammerte Liste der Feldinhalte folgt. Dabei werden alle Inhalte für als Texte definierte Felder in ' eingeschlossen, Zahlen nicht.
SQL = SQL & " VALUES ('Maier','Andreas','Musterstrasse 1','12345','Musterstadt','01234-56789',3)" oConn.Execute SQL
b) per ADO
Um per ADO Zeilen hinzufügen zu können, müssen wir als erstes ein Recordset auf die gewünschte Tabelle öffnen. Danach verwenden wir die Methode AddNew des Recordsets, füllen alle Felder mit dem gewünschtem Inhalt, und speichern die Zeile mit der Methode Update. Abbrechen können wir das Hinzufügen mittels der Methode CancelUpdate. Ein Autowertfeld darf allerdings auch hierbei nicht gefüllt werden.
Für unsere obige Tabelle nun ein kleines Beispiel:
Dim oRs As ADODB.Recordset Set oRs = New ADODB.Recordset oRs.Open "SELECT * FROM Kunden", oConn, adOpenDynamic, adOpenOptimistic With oRs .AddNew !Name = "Maier" !Vorname = "Andreas" !Straße = "Musterstraße 1" !PLZ = "12345" !Telefon = "01234-56789" !Kontakte = 3 .Update Msgbox "Die automatisch vergebene ID ist: " & CStr(!ID) End With
Bearbeiten und Löschen von Datensätzen
Für das Bearbeiten und Löschen von Datensätzen gibt es nun auch wieder zwei Wege:
- per SQL-Statement und
- per ADO
Allerdings empfiehlt es sich in jeder Tabelle einen eindeutigen Wert zu haben (am besten als Autowert), damit nicht aus Versehen der falsche Datensatz editiert oder gelöscht wird.
Fangen wir einfach mal mit dem Bearbeiten an.
a) per SQL-Anweisung:
Hierfür verwenden wir das Schlüsselwort UPDATE gefolgt vom Tabellennamen, dem Schlüsselwort SET, allen zu ändernden Feldern in der folgenden Form [FELDNAME]='neuer Inhalt' (auch hier wird bei als Text definierten Feldern der neue Inhalt in ' gepackt) , gefolgt vom Schlüsselwort WHERE und den Einschränkungen. Als Beispiel wollen wir im Kontext mit unseren obigen Beispielen in der Tabelle Kunden dem Kunden mit der ID = 15 Straße, Plz, Ort, und Kontakte verändern, da dieser umgezogen ist....
Dim lRecords As Long SQL = "UPDATE [Kunden] SET [Straße]='Neuer Weg 17a', [PLZ]='98745', " & _ "[Ort]='Musterörtchen', [Kontakte]=6 WHERE [ID]=15" oConn.Execute SQL, lRecords ' lRecords enthält nun die Anzahl der betroffenen Datensätze
b) per ADO
Dim oRs As ADODB.Recordset Set oRs = New ADODB.Recordset oRs.Open "SELECT * FROM Kunden WHERE [ID]=15", oConn, adOpenDynamic, adOpenOptimistic With oRs !Straße = "Neuer Weg 17a" !PLZ = "98745" !Ort = "Musterörtchen" !Kontakte = 6 .Update End With
Wichtig ist in beiden Fällen die genaue Navigation zu dem entsprechenden Datensatz. Wird bei der SQL-Anweisung der WHERE-Zweig vergessen oder ist nicht eindeutig (falls nicht doch gewünscht) werden alle Zeilen geändert. Bei Verwendung eines ADO-Recordsets, wird nur der Datensatz geändert, auf welchen das Recordset aktuell zeigt.
Ist das Recordset aber nicht eindeutig, d.h. der entsprechende Datensatz kommt bei den aktuellen Einschränkungen der Abfrage in der Datenbank mehr als einmal vor, wird ein Fehler ausgelöst, siehe auch FAQ-Beitrag Nicht genügend Schlüsselinformationen zum Aktualisieren.
Last but not least: Das Löschen von Datensätzen.
a) per SQL -Anweisung:
Hierfür existiert das Schlüsselwort "DELETE" und dieses wird wie folgt verwendet:
DELETE FROM [Tabelle] WHERE ....
Auch hier ist es sehr sinnvoll eine eindeutige Einschränkung zu vergeben, da sonst alle Datensätze mit den gewählten Einschränkungen ohne Rückfrage gelöscht werden. Hier nun zwei kleine Beispiele:
' Löschen aller Kunden Dim lRecords As Long oConn.Execute "DELETE FROM [Kunden]", lRecords MsgBox "Es wurden " & CStr(lRecords) & " Kunden gelöscht"
' Löschen des Kunden mit der ID = 15 Dim lRecords As Long oConn.Execute "DELETE FROM [Kunden] WHERE [ID]=15", lRecords If lRecords >= 1 Then MsgBox "Es wurden " & CStr(lRecords) & " Kunden gelöscht" Else MsgBox "Der Kunde konnte nicht gelöscht werden, da nicht vorhanden" End If
b) per ADO
Hierfür öffnen Sie das gewünschte Recordset, bewegen es auf die gewünschte Position und verwenden die Methode Delete. Auch hier nun wieder ein kleines Beispiel:
' Löschen des Kunden mit der ID = 15 Dim oRs As ADODB.Recordset Set oRs = New ADODB.Recordset oRs.Open "SELECT * FROM Kunden WHERE [ID]=15", oConn, adOpenDynamic, adOpenOptimistic oRs.Delete
Abschließend gestatten Sie bitte noch einen kleinen Hinweis: Jedes geöffnete Recordset und jede Connection sollten wieder geschlossen und zerstört werden. Dies kann auf die folgende Art und Weise durchgeführt werden:
' Recordset schließen und zerstören oRs.Close Set oRs = Nothing ' Connection schließen und zerstören oConn.Close Set oConn = Nothing
Nur wenn Sie alle Recordsets und Connections sauber wieder schließen und zerstören, wird der belegte Platz innerhalb der MSDE wieder freigegeben. Ansonsten ist die MSDE der Meinung es sind noch offene Connections vorhanden und stellt keine weiteren bereit. In diesem Falle hilft dann Stoppen und Starten der MSDE.