Mit diesem Workshop möchten wir Ihnen zeigen, wie Sie komplexe "Transact SQL (T-SQL)" Scripte mit VB und ADO auf einem MS SQL-Server, bzw. der kostenlosen MSDE absetzen können. Was wir dafür benötigen, ist ein Query Analyzer den wir uns in diesem Workshop bauen wollen. Grundlagen Zunächst wollen wir Ihnen einige Grundlagen über T-SQL vermitteln. Transact SQL, auch T-SQL genannt, sind i.d.R. komplexe Anweisungsscripte für unseren Server. Dabei kann ein solches Script aus mehreren Anweisungsblöcken bestehen. Solche Scripte führen meist direkte serverseitige Aktionen aus um Daten zu aktualisieren, zu löschen oder aber Daten zu importieren und exportieren usw... Aufbau eines Scripts: USE DatabaseName Go Anweisungsblock 1 ... ... Go Anweisungsblock 2 ... ... Go Wie hier im Aufbau zu sehen, verwenden wir ein weiteres Schlüsselwort: "USE". Mit Use <DatabaseName> wird die Datenbank gewechselt, also zur aktuellen Datenbank für das Script gemacht, da unser Server ja mehrere Datenbanken beinhaltet. Neue Datenbank erzeugen: USE master Go CREATE DATABASE [Verkauf] Go Datenbank löschen: /* ACHTUNG !!! Dieses Script löscht die Datenbank Verkauf */ USE master Go DROP1 DATABASE [Verkauf] -- Löscht die DB Verkauf Go Kommentieren Sie Ihr Script für die Nachwelt: Verwenden von Variablen: DECLARE @var1 AS Int DECLARE @var2 AS Smallmoney DECLARE @var3 AS Varchar(5) Die Wertzuweisung einer Variable erfolgt auf zwei Arten:
DECLARE @Umsatz AS Int DECLARE @Verkäufer AS Varchar(50) SET @Umsatz = 5000 SET @Verkäufer = (SELECT Nachname FROM Personal WHERE PersNr = 456) Im folgenden Beispiel wird die Tabelle Abverkauf mittels eines Schwellenwerts aktualisiert: /* Aktualisieren der Tabelle Abverkauf */ USE [Verkauf] Go DECLARE @Umsatz AS Smallmoney SET @Umsatz = 5000 UPDATE Abverkauf SET Verkaufshit = 10 WHERE Gesamtverkauf > @Umsatz Go IF Bedingungen: IF Bedingung Anweisung ELSE Anweisung Eine einfache IF Anweisung im Script könnte dann so aussehen: /* Aktualisieren der Tabelle Abverkauf */ USE [Verkauf] Go DECLARE @Umsatz AS Smallmoney SET @Umsatz = 5000 IF @Umsatz < 1000 UPDATE Abverkauf SET Verkaufshit = 0 ELSE UPDATE Abverkauf SET Verkaufshit = 10 Go Anweisungsblöcke in einer IF-Anweisung werden mit BEGIN und END eingefasst: IF Bedingung BEGIN Anweisung 1 ... Anweisung n END ELSE BEGIN Anweisung 1 ... Anweisung n END Datenimport mit BULK INSERT: USE [Verkauf] GO BULK INSERT Tabellenname FROM 'C:\Daten\Import.csv' WITH (FIELDTERMINATOR = ';', DATAFILETYPE = 'char', CODEPAGE = 'RAW') Go Bitte beachten Sie die Pfadangabe im BULK INSERT. Der Pfad muss ein gültiger Pfad für den Server sein, sonst kommt es zu einem Fehler. Table und View: Die hier aufgeführten Beispiele stellen nur eine kleine Übersicht über T-SQL dar. Wenn Sie mehr über T-SQL erfahren möchten, sollten Sie folgenden Link besuchen: Die Benutzerverwaltung des SQL-Servers: /* Anlegen eines neuen Users auf dem Server und Zulassen für die Datenbank Verkauf. Der neue User bekommt die Zugriffsrechte DataReader und DataWriter */ /* Wichtig! Da ein neuer User nur über die Master DB angelegt werden kann */ USE master Go /* User auf dem Server anlegen */ EXEC sp_addlogin 'Paul', 'x1234' Go /* Wechseln zur Datenbank Verkauf */ USE Verkauf Go /* Den neuen User die DB zuweisen */ EXEC sp_grantdbaccess 'Paul' Go /* Jetzt den User die Zugriffsrollen zuweisen */ EXEC sp_addrolemember 'db_datareader', 'Paul' Go EXEC sp_addrolemember 'db_datawriter', 'Paul' Go Stored Procedures: Stored Procedures sind Scripte, die auf dem Server liegen und auch dort ausgeführt werden. Es gibt zwei Typen von Stored Procedures: Die globalen serverweit gültigen und die datenbankspezifischen Procedures. Die globalen Procedures liegen i.d.R. in der Master-DB. Eine globale Procedure kann von jeder DB auf dem Server ausgeführt werden, eine datenbankspezifische dagegen nur aus der eigenen Datenbank. Sie ist demnach auch nur für diese Datenbank gültig. Die Ergebnisse dieser Scripte werden an den Client als Recordset zurückgegeben. Um eine Stored Procedure auszuführen, wird das Schlüsselwort "EXEC" verwendet. EXEC sp_who2 Diese Procedure bspw. liefert Ihnen alle laufenden Prozesse auf dem Server. Der MS SQL-Server, bzw. die MSDE werden mit einer Reihe von Stored Procedures ausgeliefert. Nachfolgend möchten wir Ihnen einige vorstellen. sp_droplogin: EXEC sp_droplogin 'LoginName' sp_revokedbaccess: EXEC sp_revokedbaccess 'Datenbankbenutzer' sp_droprolemember: EXEC sp_droprolemember 'DBUser' sp_addsrvrolemember: EXEC sp_addsrvrolemember 'LoginUser', 'ServerRole' sp_dropsrvrolemember: EXEC sp_dropsrvrolemember 'LoginName', 'ServerRole' sp_addrole: EXEC sp_addrole 'RoleName' sp_droprole: EXEC sp_droprole 'RoleName' sp_helpdb: EXEC sp_helpdb [Optional DatabaseName] sp_helpgroup: EXEC sp_helpgroup [Optional RoleName] sp_helpindex: EXEC sp_helpindex 'ObjectName' sp_helplogins: EXEC sp_helplogins [Optional LoginUser] sp_helprolemember: EXEC sp_helprolemember [Optional RoleName] sp_helpuser: EXEC sp_helpuser [Optional Benutzername] sp_helptext: EXEC sp_helptext 'ObjectName' Wenn Sie mehr über Stored Procedues erfahren möchten, dann sollten Sie die MSDN Online Seite besuchen: Goldgrube: Query Analyzer: So, nun aber zu unserem Query Analyzer in VB6. Das nachfolgende Klassenmodul bildet das Kernstück unseres Query Analyzers. Über die ADO Schnittstelle kann Zugriff auf den MS SQL-Server, bzw. der kostenlosen MSDE genommen werden. Das Klassenmodul ist in der Lage, komplexe T-SQL Scripte auszuführen. Dabei werden die Anweisungsblöcke, die mit "GO<CR>" getrennt sein müssen, geparst und einzeln über ein Command-Objekt ausgeführt. Die Rückgabe der betroffenen Records erfolgt über das Ereignis "RecordsAffected". ' *********************************************************************** ' * ' * clsQueryAnalyzer VB6 Klassenmodul ' * ' * Dieses Klassenmodul stellt die Basisroutinen des Query Analyzers ' * zur Verfügung. Über die ADO Schnittstelle kann Zugriff auf den ' * MS SQL-Server, bzw. der kostenlosen MSDE genommen werden. ' * ' * Das Klassenmodul ist in der Lage, komplexe T-SQL Scripte ' * auszuführen. Dabei werden die Anweisungsblöcke, die mit "GO<CR>" ' * getrennt sein müssen, geparst und einzeln über ein Command-Objekt ' * ausgeführt. Die Rückgabe der betroffenen Records erfolgt über ' * das Ereignis "RecordsAffected". ' * ' * Juli 2005 - VB-Power.net www.vb-power.net ' * ' *********************************************************************** Option Explicit ' Klassenvariablen Private WithEvents cConn As ADODB.Connection Private cTimeOut As Long ' Events Public Event RecordsAffected(ByVal AnzRecords As Long) ' Klasse initialisieren Private Sub Class_Initialize() cTimeOut = 30 End Sub ' Active Connection Public Property Set ActiveConn(vData As ADODB.Connection) Set cConn = vData End Property ' Command TimeOut Public Property Let TimeOut(ByVal vData As Long) cTimeOut = vData End Property Public Property Get TimeOut() As Long TimeOut = cTimeOut End Property ' =========================== ' Hauptroutine Query Analyzer ' =========================== Public Function RunTSQL(TSQL As String) As Boolean Dim oCmd As New ADODB.Command Dim oRSCmd As ADODB.Recordset Dim cmdSet() As String Dim lRet As Long Dim X As Long ' Überprüfungen If cConn Is Nothing Then Exit Function If TSQL = "" Then Exit Function On Error GoTo RunTSQL_Error ' Das Script parsen. Dabei werden die Anweisungsblöcke ' in das Array geschoben. Es wird angenommen, ' dass die einzelnen Anweisungen im Script ' mit "go<CR>" getrennt sind. cmdSet = TSQLParser(TSQL) With oCmd ' Command initialisieren .ActiveConnection = cConn .CommandType = adCmdText .CommandTimeout = cTimeOut ' Schleife über alle Anweisungen ' aus dem T-SQL Script. For X = 0 To UBound(cmdSet) If cmdSet(X) <> "" Then ' RollBack sicherstellen cConn.BeginTrans ' T-SQL ausführen .CommandText = Trim(cmdSet(X)) Set oRSCmd = .Execute(lRet) ' Wenn kein Fehler, dann übernehmen cConn.CommitTrans ' Ereignis auslösen RaiseEvent RecordsAffected(lRet) End If Next X End With ' Command und Recodset terminieren Set oCmd = Nothing Set oRSCmd = Nothing RunTSQL = True Exit Function RunTSQL_Error: cConn.RollbackTrans Set oCmd = Nothing Set oRSCmd = Nothing RunTSQL = False MsgBox Err.Description, vbCritical, "Fehler" End Function ' ===================== ' SQL-Syntax überprüfen ' ===================== Public Function CheckTSQL(TSQL As String) As Boolean If cConn Is Nothing Then Exit Function If TSQL = "" Then Exit Function ' Ausführung unterdrücken cConn.Execute "SET NOEXEC ON" ' Syntax prüfen If RunTSQL(TSQL) Then CheckTSQL = True Else CheckTSQL = False End If ' Ausführung wieder zulassen cConn.Execute "SET NOEXEC OFF" End Function ' Hilfsfunktion Private Function TSQLParser(ByVal oText As String) As Variant Dim tmpStr As String tmpStr = oText tmpStr = Replace(tmpStr, "go" & vbCrLf, "GO" & vbCrLf, , , vbBinaryCompare) tmpStr = Replace(tmpStr, "Go" & vbCrLf, "GO" & vbCrLf, , , vbBinaryCompare) tmpStr = Replace(tmpStr, "gO" & vbCrLf, "GO" & vbCrLf, , , vbBinaryCompare) TSQLParser = Split(tmpStr, "GO" & vbCrLf) End Function ' Ereignis der Connection Private Sub cConn_InfoMessage(ByVal pError As ADODB.Error, _ adStatus As ADODB.EventStatusEnum, _ ByVal pConnection As ADODB.Connection) If adStatus = adStatusErrorsOccurred Then MsgBox Err.Description End If End Sub Demoprojekt Query Analyzer: Das Demoprojekt gibt es hier zum downloaden. Ich wünsche Ihnen gutes Gelingen mit dem Query Analyzer. Dieser Workshop wurde bereits 37.367 mal aufgerufen.
Anzeige
![]() ![]() ![]() (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevWizard für VB5/6 ![]() Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Tipp des Monats ![]() Dieter Otter PopUp-Menü wird nicht angezeigt :-( In diesem Tipp verraten wir Ihnen, wie Sie Probleme mit PopUp-Menüs umgehen können, wenn diese unter bestimmten Umständen einfach nicht angezeigt werden. vb@rchiv CD Vol.6 ![]() ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. |
|||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |