Seite 1 von 1

Wie eine DSN on the fly erstellen ?

Verfasst: 17.06.2012 06:13
von Bisonte
Hallo.

Ich hab da gerade ein Problem an dem ich mir die Zähne ausbeisse...

Mit PB4.61 x86 , installierter MySQL ODBC 3.51 Driver (32Bit), Win7 x64 krieg ich "on the fly"
keine DSN eingetragen, die ich dann auch nutzen kann.
(Xampp als MySQL Server also localhost mit port 3306)

Wenn ich die DSN mit dem Connector erstelle klappt das allerdings.

Ich habe diverse Methoden ausprobiert (Beispiel von Rings&bobobo, PBOSL_Exdatabase)
Auch den Admin Modus anfordern brachte keinen Eintrag unter Verwaltung\ODBC Datenquellen

Wie bekommt man das in PB hin (bei obiger Konfiguration) das ich eine ODBC DB öffnen kann ?
Mit PB4.3 und XP funktionierte das noch...

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 17.06.2012 11:20
von Kiffi
probiers mal hiermit:

http://www.purebasic.fr/english/viewtop ... 02#p322802

Grüße ... Kiffi

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 17.06.2012 11:27
von KeyPusher
Eine Lösung kann ich dir nicht direkt anbieten, da ich hier nicht deine Konfiguration habe. Aber vielleicht hilft dir folgendes Beispiel und Links weiter.

http://msdn.microsoft.com/en-us/library ... 05%29.aspx
http://msdn.microsoft.com/en-us/library ... 80%29.aspx
ODBC Connection String Structure Specification

Code: Alles auswählen

;
; Konfig-Datei mit folgenden Keys erstellen
; Werte können natürlich nur Beispiele sein
;
;         [ODBC]
;         DSN = TimeStamp
;         SERVER = 127.0.0.1
;         ADDRESS = 127.0.0.1,3306
;         DESCRIPTION = OSArbeitszeit
;         DATABASE = Timestampsql
;         DRIVER = MySQL ODBC 3.51 Driver 
;         QUERYLOG_ON = yes
;         QUERYLOGFILE = c:\ODBCquery.log
;         QUERYLOGTIME = 1
;         STATSLOG_ON = yes
;         STATSLOGFILE = c:\ODBCPerformance.log
;         TRUSTED_CONNECTION = 0
;         UID = Username
;         PWD = Password

Procedure OSCreateODBC(Map ODBCAttrib.s())
    strAttrib.s=""
    lpszDriver.s=ODBCAttrib("DRIVER")
    DeleteMapElement(ODBCAttrib(),"DRIVER")
    If FindMapElement(ODBCAttrib(),"TRUSTED_CONNECTION")
        If ODBCAttrib("TRUSTED_CONNECTION")="1" Or LCase(ODBCAttrib("TRUSTED_CONNECTION"))="yes"
            DeleteMapElement(ODBCAttrib(),"UID")
            DeleteMapElement(ODBCAttrib(),"PWD")
        EndIf
    EndIf
    ResetMap(ODBCAttrib())
    While NextMapElement(ODBCAttrib())
        strAttrib.s+MapKey(ODBCAttrib())+"="+ODBCAttrib(MapKey(ODBCAttrib()))+";"
    Wend
    strAttrib+";"
    FreeMap(ODBCAttrib())
    *Buffer=AllocateMemory(Len(strAttrib)) 
    CopyMemory(@strAttrib,*Buffer,Len(strAttrib)) 
    For L=0 To Len(strAttrib)-1
        If PeekB(*Buffer+L)=';' 
            PokeB(*Buffer+L,0) 
        EndIf 
    Next L 
    Result = SQLConfigDataSource_(0,#ODBC_ADD_DSN,lpszDriver.s,*Buffer ) 
    FreeMemory(*Buffer) 
    ProcedureReturn Result
EndProcedure 

NewMap ODBCAttr.s()

If Not OpenPreferences(MyConfigFile$)
    MessageRequester("ACHTUNG","Keine Konfig-Datei vorhanden!",#PB_MessageRequester_Ok)
    End
EndIf    
If Not PreferenceGroup("ODBC")
    MessageRequester("ACHTUNG","Keine ODBC-Daten vorhanden!",#PB_MessageRequester_Ok)
    End
EndIf
ExaminePreferenceKeys()
While NextPreferenceKey()
    Name.s=PreferenceKeyName()
    ODBCAttr(UCase(Name))=PreferenceKeyValue()
Wend
ClosePreferences()

If Not OSCreateODBC(ODBCAttr())
    MessageRequester("ACHTUNG","Erstellen/Änderung der User-ODBC fehlgeschlagen!",#PB_MessageRequester_Ok)
    End
Else
    MessageRequester("Info","Erfolgreich User-ODBC erstellt bzw. geändert!",#PB_MessageRequester_Ok)
EndIf        

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 17.06.2012 16:28
von Bisonte
Dank euch beiden. Erfolg hatte ich bereits mit einigen Abwandlungen der srod-Methode mit einem Schwung shire ;)

Und weiterhin hab ich sogar noch ein bisschen "Extras" herausgefunden (Die Optionflags)

Hier mal mein "Rezept" für ebenfalls suchende...

Code: Alles auswählen

;@____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; »»» 
; »»» MySQL ODBC 3.51 Connector
; »»» 
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
EnableExplicit
;
#ODBC_ADD_DSN    = 1   
#ODBC_CONFIG_DSN = 2
#ODBC_REMOVE_DSN = 3
;
; Option Flags for ODBC MYSQL 
; Link : http://dev.mysql.com/doc/refman/5.0/en/connector-odbc-configuration-connection-parameters.html
; dort kann man weitere Flags finden
;
#FLAG_FIELD_LENGTH     = 1
#FLAG_FOUND_ROWS       = 2
#FLAG_COMPRESSED_PROTO = 2048
;
#ODBC_OPTION_FLAGS = #FLAG_FIELD_LENGTH|#FLAG_FOUND_ROWS|#FLAG_COMPRESSED_PROTO
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.i ODBC_AddConnection(ConnectionString.s)
  
  ; Idea : shire
  ; Link : http://www.purebasic.fr/english/viewtopic.php?p=371161#p371161
  
  Protected Result
  
  Result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, "MySQL ODBC 3.51 Driver", ConnectionString)
  
  ProcedureReturn Result
  
EndProcedure
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.i ODBC_RemoveConnection(DSN.s)
  ; srod
  Protected Result

  Result=SQLConfigDataSource_(0,#ODBC_REMOVE_DSN,"MySQL ODBC 3.51 Driver","DSN="+DSN)
  If Result
    ProcedureReturn #True
  EndIf
EndProcedure
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.s CreateDNS(DSN.s, User.s, Pass.s, Database.s, Server.s="localhost", Port = 3306, OptionFlags = #ODBC_OPTION_FLAGS, Description.s = "Description")
  
  ; mein bescheidener Beitrag (Eigentlich nur für MySQL 3.51, evt. auch für 5 funktionieren
  
  Protected CS.s = "", Result
    
  CS = "DSN=" + DSN + "; "
  CS + "DESCRIPTION=" + Description + "; "
  CS + "SERVER=" + Server + "; "
  CS + "PORT=" + Str(Port) + "; "
  CS + "USER=" + User + "; "
  CS + "PASSWORD=" + Pass + "; "
  CS + "DATABASE=" + Database + "; "
  CS + "OPTION=" + Str(OptionFlags)
  
  Result = ODBC_AddConnection(CS)
  If Result
    ProcedureReturn DSN
  Else
    MessageRequester("Error","Check your Data")
    ProcedureReturn ""
  EndIf
   
EndProcedure
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; Beispiel
;
Define DSN.s
DSN = CreateDNS("Meine-DSN","Username","Passwort","Datenbankname","localhost",3306,#ODBC_OPTION_FLAGS,"Beschreibung")
; ODBC_RemoveConnection(DSN)

ist zwar auf nix getestet (Unicode usw) aber für mal eben funktioniert es... Wenn bessere Versionen erdacht werden, immer her damit ;)

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 18.06.2012 11:38
von mk-soft
Schon etwas älter, funktioniert als Include "ExDatabase.pbi" aber immer noch

http://www.purebasic.fr/german/viewtopi ... n&start=50

http://home.arcor.de/m_kastner/MyDownlo ... taBase.zip

FF :wink:

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 18.06.2012 13:17
von Bisonte
mk-soft hat geschrieben:Schon etwas älter, funktioniert als Include "ExDatabase.pbi" aber immer noch
Diese Include hat bei mir leider keine DSN erstellt. Die hatte ich zuerst probiert, weil ich die früher immer genutzt hatte.

Re: Wie eine DSN on the fly erstellen ?

Verfasst: 18.06.2012 16:42
von mk-soft
Nur 32Bit !!!

Unter 64Bit funktioniert alles anders...