ConnectionString-Builder
Verfasst: 21.01.2005 13:55
Hallo,
hier ein kleiner Code, um auf Connectionstrings mit PB zu erstellen oder
zu ändern. Vielleicht kann's ja jemand gebrauchen...
Connectionstrings benötigt man z.B., um via ADO auf ACCESS oder
SQL-Server-Datenbanken zuzugreifen.
Grüße ... Kiffi
hier ein kleiner Code, um auf Connectionstrings mit PB zu erstellen oder
zu ändern. Vielleicht kann's ja jemand gebrauchen...
Connectionstrings benötigt man z.B., um via ADO auf ACCESS oder
SQL-Server-Datenbanken zuzugreifen.
Grüße ... Kiffi
Code: Alles auswählen
Enumeration
#frmMain
EndEnumeration
Enumeration
#txtConnectionString
#cmdEditConnectionString
EndEnumeration
Procedure.s x_Uni2Ansi(unicodestr.l)
; Original by aXend
lenA = WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, 0, 0, 0, 0);
ansistr.s = Space(lenA)
If (lenA > 0)
WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, @ansistr, lenA, 0, 0);
EndIf
ProcedureReturn ansistr
EndProcedure
Procedure.l x_Ansi2Uni(ansistr.s)
; Original by aXend
lenA.l = Len(ansistr)
lenW = MultiByteToWideChar_(#CP_ACP, 0, ansistr, lenA, 0, 0)
If (lenW > 0) ; Check whether conversion was successful
unicodestr = SysAllocStringLen_(0, lenW)
MultiByteToWideChar_(CP_ACP, 0, ansistr, lenA, unicodestr, lenW)
result = unicodestr
SysFreeString_(unicodestr)
ProcedureReturn result
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.s EditConnectionString(sConnString.s)
; Temp-Pfad ermitteln
sTempPath.s = Space(1024)
GetTempPath_(1024,sTempPath)
sUDLFile.s = sTempPath + "temp.udl"
; UDL-Datei erstellen
FF = CreateFile(#PB_Any, sUDLFile)
If FF
sConnString = "[oledb]" + #CRLF$ + "; Everything after this line is an OLE DB initstring" + #CRLF$ + sConnString + #CRLF$
WriteByte(255)
WriteByte(254)
WriteData(x_Ansi2Uni(sConnString), Len(sConnString)*2)
CloseFile(FF)
EndIf
; Dialog zum Editieren des UDL anzeigen
RunProgram(sUDLFile,"","", 1)
; Nun UDL öffnen und analysieren
FF = OpenFile(#PB_Any,sUDLFile)
If FF
; Der Inhalt der UDL-Datei liegt im Unicode-Format vor, welches PB (noch) nicht unterstützt
; Aus diesem Grund muss dieser in einfaches ANSI konvertiert werden
MemBuff = AllocateMemory(Lof())
ReadData(MemBuff, Lof())
sConnString.s = x_Uni2Ansi(MemBuff)
FreeMemory(MemBuff)
; Nun den relevanten Connectionstring herausfiltern
pos1 = FindString(sConnString, "Provider", 1)
If pos1
pos2 = FindString(sConnString, #CRLF$, pos1)
If pos2
sConnString = Mid(sConnString, pos1, pos2 - pos1)
Else
sConnString = ""
EndIf
Else
sConnString = ""
EndIf
CloseFile(FF)
Else
sConnString = ""
EndIf
ProcedureReturn sConnString
EndProcedure
If OpenWindow(#frmMain, 0, 0, 600, 30, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "ConnectionString-Builder")
If CreateGadgetList(WindowID(#frmMain))
StringGadget(#txtConnectionString,5,5,550,20,"",#PB_String_MultiLine)
ButtonGadget(#cmdEditConnectionString,560,5,35,20,"...")
EndIf
Repeat
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadgetID()
Case #cmdEditConnectionString
sDummy.s = EditConnectionString(GetGadgetText(#txtConnectionString))
If Len(sDummy) > 0
SetGadgetText(#txtConnectionString, sDummy)
EndIf
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
End