Datenbank migrieren

Eine Datenbank von SQL Server 2000 auf SQL Server 20XX zu portieren stellt manchmal ein Problem dar.
Soll man das mit dem DTS Wizard für Daten Im-/Export machen?
Ich persönlich hänge die Datenbank auf dem alten Server ab und hänge sie in den neuen Server ein.
Meistens geht das ohne größere Probleme.

Zunächst muss sichergestellt sein, dass niemand mehr auf die Datenbank zugreift. Im Query Analyzer gibt man diese Befehle ein:

use master
sp_detach_db 'datenbank', 'true'
use master
sp_detach_db 'datenbank', 'true'

Die Datenbank ist damit abgehängt und ist auf dem alten Server nicht mehr verfügbar. Danach kann man die zugrundeliegenden Dateien (“.MDF” und “.LDF”, siehe Codezeile unten) aus dem Daten-Verzeichnis des alten Servers in das Daten-Verzeichnis des neuen Servers kopieren.

Der nächste Befehl (eingegeben im Query Analyzer der neuen Servers) hängt die Datenbankdateien auf dem neuen Server wieder ein:

sp_attach_db 'datenbank', 'C:\Programme\Microsoft SQL Server\MSSQL\Data\datenbank_Data.MDF', 'C:\Programme\Microsoft SQL Server\MSSQL\Data\datenbank_Log.LDF'
sp_attach_db 'datenbank', 'C:\Programme\Microsoft SQL Server\MSSQL\Data\datenbank_Data.MDF', 'C:\Programme\Microsoft SQL Server\MSSQL\Data\datenbank_Log.LDF'

Der Speicherort muss natürlich exakt angegeben werden. Nach ein paar Sekunden (oder Minuten, je nach Größe der Datenbank) steht die Datenbank auf dem neuen Server wieder zur Verfügung.

Beim Einhängen wird die Datenbank konvertiert. Meistens geht das gut. Manchmal auch nicht :) Dann muss man manuell nacharbeiten. Alles in allem ist dies die einfachste und schnellste Möglichkeit, eine Datenbank von SQL Server 2000 zu migrieren, die ich so kenne.

Ein einfacher Logger

Ein einfacher Logger, dem man den zu loggenden String übergibt. Alles andere macht er selbst (Datum, Uhrzeit anhängen).
Alternativ kann dem Logger auch der Dateiname übergeben werden, in welche Datei er das loggen soll.

' Ein Verweis auf "Microsoft Scripting Runtime" muss gesetzt werden!

Private Sub Log2(ByVal iMeldung As String, Optional ByVal iDateiname As String = "log.log")
Dim FSO As FileSystemObject
Dim TS As TextStream
 
Set FSO = New FileSystemObject
If Not FSO.FileExists(iDateiname) Then FSO.CreateTextFile iDateiname, False
Set TS = FSO.OpenTextFile(iDateiname, ForAppending)
TS.WriteLine CStr(Now) & ": " & iMeldung
TS.Close
Set FSO = Nothing
 
End Sub
' Ein Verweis auf "Microsoft Scripting Runtime" muss gesetzt werden!

Private Sub Log2(ByVal iMeldung As String, Optional ByVal iDateiname As String = "log.log")
Dim FSO As FileSystemObject
Dim TS As TextStream

Set FSO = New FileSystemObject
If Not FSO.FileExists(iDateiname) Then FSO.CreateTextFile iDateiname, False
Set TS = FSO.OpenTextFile(iDateiname, ForAppending)
TS.WriteLine CStr(Now) & ": " & iMeldung
TS.Close
Set FSO = Nothing

End Sub

 

Formel in VB 6 evaluieren

Manchmal kommt man in die Not, einen frei eingebbaren mathematischen Ausdruck auswerten zu müssen.
Besonders bei der berühmten Taschenrechner-Applikation, die jeder einmal irgendwann in seinem Leben schreiben muss, lohnt es nicht, einen eigenen Parser dafür zu schreiben.
Visual Basic bietet eine einfache Möglichkeit, das zu bewerkstelligen. Das “Script Control” erledigt alles.
Hier ein Taschenrechner in seiner simpelsten Form:

Public Function Eval(ByVal iFormel As String) As Double
Dim sc As ScriptControl
 
On Error GoTo MyFehler
 
Set sc = New ScriptControl
sc.Language = "vbscript"
Eval = sc.Eval(iFormel)
Exit Function
 
MyFehler:
MsgBox "Formel '" & iFormel & "' kann nicht evaluiert werden!" & vbCrLf & "Fehler: " & Err.Description
Exit Function
 
End Function
Public Function Eval(ByVal iFormel As String) As Double
Dim sc As ScriptControl

On Error GoTo MyFehler

Set sc = New ScriptControl
sc.Language = "vbscript"
Eval = sc.Eval(iFormel)
Exit Function

MyFehler:
MsgBox "Formel '" & iFormel & "' kann nicht evaluiert werden!" & vbCrLf & "Fehler: " & Err.Description
Exit Function

End Function

Der Aufruf ist ebenso simpel:

Ergebnis = Eval(3*4+20/5) ' Ergebnis = 16
Ergebnis = Eval(3*4+20/5) ' Ergebnis = 16

Wie man erkennen kann, werden selbstverständlich mathematische Rechenregeln beachtet.

Wichtig: Unter Verweise muss im zugrundeliegenden Visual Basic Projekt ein Verweis auf “Microsoft Script Control x.x” gesetzt werden!

Natürlich steht es jedem frei, auch einen umfangreichen Parser zu schreiben, der den Ausdruck zerlegt und dann auswertet. Aber die oben gezeigte Möglichkeit finde ich wesentlich effektiver.

Zahlen ins 35er System wandeln

Recht sinnfrei, aber wer’s mal haben möchte: Zahlen wandeln in ein beliebiges Zahlensystem unter VB6.
Naja, beliebig ist relativ. Die hier aufgeführte Version macht’s bis zum 35er-System (und bedient sich dabei der restlichen Buchstaben bis “Z” nach dem 16er-System mit “F”).

Private Function lfWandler(ByVal iZahl As Long, ByVal iBasis As Long) As String
Dim lvZahlen As String
Dim lvErgebnis As String
Dim lvRest As Long
 
If iZahl = 0 Then lfWandler = "0": Exit Function
If iBasis = 1 Then lfWandler = iZahl: Exit Function
 
lvZahlen = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ"
 
lvRest = iZahl
While Not (lvRest = 0)
lvErgebnis = Mid(lvZahlen, lvRest Mod iBasis + 1, 1) & lvErgebnis
lvRest = iZahl \ iBasis
iZahl = lvRest
Wend
 
lfWandler = lvErgebnis
 
End Function
Private Function lfWandler(ByVal iZahl As Long, ByVal iBasis As Long) As String
Dim lvZahlen As String
Dim lvErgebnis As String
Dim lvRest As Long

If iZahl = 0 Then lfWandler = "0": Exit Function
If iBasis = 1 Then lfWandler = iZahl: Exit Function

lvZahlen = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ"

lvRest = iZahl
While Not (lvRest = 0)
lvErgebnis = Mid(lvZahlen, lvRest Mod iBasis + 1, 1) & lvErgebnis
lvRest = iZahl \ iBasis
iZahl = lvRest
Wend

lfWandler = lvErgebnis

End Function

Ich glaube, das war eine der ersten Routinen, die ich je geschrieben habe. Damals noch im BASIC des VC-20 :)

Natürlich kann man den lvZahlen-String noch beliebig erweitern. Wenigstens solange man unterschiedliche ASCII-Zeichen zur Vverfügung hat…
Eine tolle Erweiterung wäre die Bearbeitung von negativen Zahlen und “krummen” Basen. Viel Erfolg :)

Laufen wir in der IDE?

Unter .NET kann man prüfen, ob das hier wahr ist:

System.Diagnostics.Debugger.IsAttached
System.Diagnostics.Debugger.IsAttached

Falls ja, befinden wir uns in der IDE. Ansonsten sind wir ein Kompilat (nein, kein Kombinat, das war etwas anderes…)