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
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
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...