DSN Helper - Add & Remove DSN für ODBC Zugriff

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
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

DSN Helper - Add & Remove DSN für ODBC Zugriff

Beitrag von mk-soft »

[EDIT]
Ist zwar schon etwas älter, habe aber den Code jetzt für MySQL erweitert :wink:

Neuer optionaler Parameter "Server" für MySQL. Defaultwert ist "localhost"

Neu von ts-soft (PBOSL)
http://www.purebasic.fr/german/viewtopic.php?t=12402


Datei: "DsnHelper.pb"

Code: Alles auswählen

;-TOP
; Kommentar : DSN Helper
; Version   : v1.04
; Author    : Michael Kastner
; Datei     : DsnHelper.pb
; Erstellt  : 28.09.2006
; Geändert  : 28.08.2007

; ***************************************************************************************
Enumeration 1
  #ODBC_ADD_DSN             ; // Add data source
  #ODBC_CONFIG_DSN          ; // Configure (edit) Data source
  #ODBC_REMOVE_DSN          ; // Remove data source
  #ODBC_ADD_SYS_DSN         ; // add a system DSN
  #ODBC_CONFIG_SYS_DSN      ; // Configure a system DSN
  #ODBC_REMOVE_SYS_DSN      ; // remove a system DSN
  #ODBC_REMOVE_DEFAULT_DSN  ; // remove the default DSN
EndEnumeration
; ***************************************************************************************

Procedure.s MyAddDSN(databasename.s, user.s = "", pass.s = "", driver.s = "", server.s = "localhost") ; Result DSN
  Protected name.s, prefix.s, strDriver.s, strAttributes.s
  Protected L.l, result.l
  Protected *buffer.Character
  
  ; Databasename erzeugen (DSN)
  prefix = ProgramFilename()
  prefix = GetFilePart(prefix)
  prefix = Left(prefix, Len(prefix) - (Len(GetExtensionPart(prefix)) + 1))
  
  name.s = GetFilePart(databasename)
  name = Left(name, Len(name) - (Len(GetExtensionPart(name)) + 1))
  name = prefix + "_" + UCase(name)
  ; Bei fehlenden driver automatisch wählen
  If driver = ""
    driver = GetExtensionPart(databasename)
  EndIf
  ; Datenbanktreiber auswählen
  Select UCase(driver)
    Case "MYSQL"
      name = prefix + "_" + UCase(databasename)
      strDriver.s = "MySQL ODBC 3.51 Driver"
      ; Attributes zustellen
      strAttributes.s = "Server=" + server
      strAttributes.s + ";Description=" + name
      strAttributes.s + ";DSN=" + name
      strAttributes.s + ";DATABASE=" + databasename
      strAttributes.s + ";UID=" + user
      strAttributes.s + ";PWD=" + pass + ";"
    Case "ACCESS", "MDB"
      strDriver.s = "Microsoft Access Driver (*.mdb)"
      ; Attributes zustellen
      strAttributes.s = "Server=APServer;Description=" + name
      strAttributes.s + ";DSN=" + name
      strAttributes.s + ";DBQ=" + databasename
      strAttributes.s + ";UID=" + user
      strAttributes.s + ";PWD=" + pass + ";"
    Case "EXCEL", "XLS"
      strDriver.s = "Microsoft Excel Driver (*.xls)"
      ; Attributes zustellen
      strAttributes.s = "Server=APServer;Description=" + name
      strAttributes.s + ";DSN=" + name
      strAttributes.s + ";DBQ=" + databasename
      strAttributes.s + ";UID=" + user
      strAttributes.s + ";PWD=" + pass + ";"
    Case "DBASE", "DBF"
      strDriver.s = "Microsoft dBase Driver (*.dbf)"
      ; Attributes zustellen
      strAttributes.s = "Server=APServer;Description=" + name
      strAttributes.s + ";DSN=" + name
      strAttributes.s + ";DBQ=" + GetPathPart(databasename)
      strAttributes.s + ";UID=" + user
      strAttributes.s + ";PWD=" + pass + ";"
    Case "TEXT", "TXT", "CSV"
      strDriver.s = "Microsoft Text Driver (*.txt; *.csv)"
      ; Attributes zustellen
      strAttributes.s = "Server=APServer;Description=" + name
      strAttributes.s + ";DSN=" + name
      strAttributes.s + ";DBQ=" + GetPathPart(databasename)
      strAttributes.s + ";UID=" + user
      strAttributes.s + ";PWD=" + pass + ";"
    Default
      strDriver.s = driver
  EndSelect
 
  *buffer = @strAttributes
  For L = 0 To Len(strAttributes) - 1
    If *buffer\c = ';'
      *buffer\c = 0
    EndIf
    *buffer + 1
  Next L                                                         ; Check the next byte

  result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, @strAttributes)   ; Call the function you need from the ODBC library with the right details
   
  If result
    ProcedureReturn name
  Else
    ProcedureReturn ""
  EndIf

EndProcedure
 
; ***************************************************************************************

Procedure.l MyRemoveDSN(databasename.s, driver.s = "")
  Protected name.s, prefix.s, strDriver.s, strAttributes.s
  Protected L.l, result.l
  Protected *buffer.Character
 
  ; Databasename erzeugen
  prefix = ProgramFilename()
  prefix = GetFilePart(prefix)
  prefix = Left(prefix, Len(prefix) - (Len(GetExtensionPart(prefix)) + 1))
  
  name = GetFilePart(databasename)
  name = Left(name, Len(name) - 4)
  name = prefix + "_" + UCase(name)
  ; Bei fehlenden driver automatisch wählen
  If driver = ""
    driver = GetExtensionPart(databasename)
  EndIf
  ; Datenbanktreiber auswählen
  Select UCase(driver)
    Case "MYSQL"
      name = prefix + "_" + UCase(databasename)
      strDriver.s = "MySQL ODBC 3.51 Driver"
    Case "ACCESS", "MDB"
      strDriver = "Microsoft Access Driver (*.mdb)"
    Case "EXCEL", "XLS"
      strDriver = "Microsoft Excel Driver (*.xls)"
    Case "DBASE", "DBF"
      strDriver = "Microsoft dBase Driver (*.dbf)"
    Case "TEXT", "TXT", "CSV"
      strDriver = "Microsoft Text Driver (*.txt; *.csv)"
    Default
      strDriver = driver
  EndSelect
  ; Attributes zustellen
  strAttributes = "DSN=" + name + ";"
 
  *buffer = @strAttributes
  For L = 0 To Len(strAttributes) - 1
    If *buffer\c = ';'
      *buffer\c = 0
    EndIf
    *buffer + 1
  Next L
 
  result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, @strAttributes)   ; Call the function you need from the ODBC library with the right details
 
  ProcedureReturn result

EndProcedure
 
; ***************************************************************************************

Procedure GetTablesList(Datenbank, List.s())

  Protected hwnd.l, r1.l, len.l
  Protected *buffer
  Protected result.s
 
  hwnd = PeekL(IsDatabase(Datenbank) + 4)
  If hwnd
    r1 = SQLTables_(hwnd,0,0,0,0,0,0,0,0) & $FFFF
    If r1 = 0 Or r1 = 1
      *buffer = AllocateMemory(256)
      SQLBindCol_(hwnd,3,1,*buffer,256,@len)
      While SQLFetch_(hwnd) & $FFFF = 0
        AddElement(List())
        List() = PeekS(*buffer, len)
      Wend
      FreeMemory(*buffer)
    EndIf
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  
EndProcedure 

; ***************************************************************************************

Procedure.s GetTables(Datenbank)

  Protected hwnd.l, r1.l, len.l
  Protected *buffer
  Protected result.s
  
  hwnd = PeekL(IsDatabase(Datenbank) + 4)
  result.s = ""
  If hwnd
    r1 = SQLTables_(hwnd,0,0,0,0,0,0,0,0) & $FFFF
    Debug r1
    If r1 = 0 Or r1 = 1
      *buffer = AllocateMemory(256)
      SQLBindCol_(hwnd,3,1,*buffer,256,@len)
      While SQLFetch_(hwnd) & $FFFF = 0
        result + PeekS(*buffer, len) + ";"
      Wend
      FreeMemory(*buffer)
    EndIf
  EndIf
  ProcedureReturn result
  
EndProcedure
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

da fällt mir noch ein

wenn bei der MySqlODBCEinrichtung noch ein Feld Option mit dem
Wert 2048 eingefügt wird, freut sich der Anwender (die Verbindung
könnte dann beschleunigt werden, da so auf der Verbindung komprimiert wird)

ich hab durch das Setzen jedenfalls ne gut bemerkbare gar nicht mal so
unerhebliche Verbindungsgeschwindigkeit zu entfernten MySQL-
DBMSen (dafür müsste der obige eh noch angepasst werden, weil da der
localhost fixiert ist)

(Kann man auch im ConnectorDialog des MySQL-Odbc-Treiber's ein-
stellen .. Reiter Advanced .. Flags1 :Use Compressed Protocol)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten