Wie eine DSN on the fly erstellen ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Wie eine DSN on the fly erstellen ?

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie eine DSN on the fly erstellen ?

Beitrag von Kiffi »

probiers mal hiermit:

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

Grüße ... Kiffi
a²+b²=mc²
KeyPusher
Beiträge: 52
Registriert: 04.10.2006 10:56

Re: Wie eine DSN on the fly erstellen ?

Beitrag 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        
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Wie eine DSN on the fly erstellen ?

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie eine DSN on the fly erstellen ?

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Wie eine DSN on the fly erstellen ?

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie eine DSN on the fly erstellen ?

Beitrag von mk-soft »

Nur 32Bit !!!

Unter 64Bit funktioniert alles anders...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten