ConnectionString-Builder

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

ConnectionString-Builder

Beitrag von Kiffi »

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

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