Seite 1 von 1

Erstellung DSN Access 2007 (*.accdb)

Verfasst: 26.06.2014 20:53
von Pelagio
Hallo Leute,

ich habe mich erfolgreich mit der Programmierung von Access-Dateien (*.mdb) verstanden.
Erstellen, Füllen, Lesen und dies wollte ich eigentlich auch weiterhin nicht missen. Inzwischen hat, ab Access 2007, Microsoft eine neues Format eingeführt '*.ACCDB' .
In meinem jugendlichen Leichtsinn :lol: bin ich davon ausgegangen das ich nur den Treiber ändern muss, von 'Microsoft Access Driver (*.mdb)' auf 'Microsoft Access Driver (*.mdb,*.accdb)', und alles andere bleibt wie gehabt. Pustekuchen! Leider scheint dies nicht der Fall zu sein und so wollt ich Euch fragen welche Änderungen wurden mit dem neuen Format noch eingeführt?
Jedenfalls bekomme ich immer die Fehlermeldung 'Komponente wurde in der Registrierung nicht gefunden'. Was immer das auch heißen soll.

Code: Alles auswählen

; Access DSN Erstellen
; OK = DSN_Create(Files.s)
   Procedure.a DSN_Create(vFiles.s)
      Shared mDSN, mCON
      Protected n.i, pResult.i, *pMemory
      Protected pTreiber.s  = "Microsoft Access Driver (*.mdb,*.accdb)"

      If OpenLibrary(1, "ODBCCP32.DLL")
         mDSN = ReplaceString(GetFilePart(vFiles),".","_")
         mCON = "Server=SomeServer; Description=Description For Purebasic MDB-ODBC;DSN=" + mDSN + ";DBQ=" + vFiles + ";UID=;PWD=;"
         *pMemory = AllocateMemory(Len(mCON))
         CopyMemory(@mCon, *pMemory, Len(mCon))
         For n=1 To Len(mCON)
            If PeekB(*pMemory+n-1)=Asc(";"): PokeB(*pMemory+n-1, #False): EndIf 
         Next n 
         pResult = CallFunction(1, "SQLConfigDataSource", 0, #ADD_DSN, @pTreiber, *pMemory)
         SQLConfigDataSource_(0, #ADD_DSN, #Treiber, *pMemory)
         FreeMemory(*pMemory): CloseLibrary(1) 
         If pResult: pResult = #True: EndIf 
      EndIf
      ProcedureReturn pResult
   EndProcedure 
Dies ist mein Code zur Erstellung DSN.
Ich kann zwar auch weiterhin mit ' *mdb' Dateien arbeiten aber da es dies neue Format gibt, wollte ich auch damit versuchen zu arbeiten.

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 26.06.2014 21:12
von Kiffi

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 27.06.2014 08:47
von Pelagio
Danke Kiffi für den Link,
:bounce:
er ist eine gute Inspiration.
Aber genauso, bis auf UID=Admin, habe ich den Connectionstring bei mir auch geschrieben.
Die Fehlermeldung ''Komponente wurde in der Registrierung nicht gefunden' kommt aber weiterhin, auch wenn ich 'UID=Admin' mit einbinde. :bluescreen:

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 27.06.2014 09:09
von Kiffi
Pelagio hat geschrieben:Die Fehlermeldung ''Komponente wurde in der Registrierung nicht gefunden' kommt aber weiterhin, auch wenn ich 'UID=Admin' mit einbinde. :bluescreen:
Google spuckt bei dieser Fehlermeldung schon einiges brauchbares aus.

Ich meine mich erinnern zu können, dass es diesbezüglich manchmal Probleme mit 32/64-Bit gibt. Vielleicht forscht Du auch mal in diese Richtung.

Grüße ... Kiffi

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 27.06.2014 09:49
von Pelagio
:bounce: Ich bin ein Schritt weiter!

Bis dato habe ich den Treiber wie folgt geschrieben:
#Treiber = "Microsoft Access Driver (*.mdb,*.accdb)"
und die Fehlermeldung ''Komponente wurde in der Registrierung nicht gefunden" bekommen und das Programm lief nicht weiter.
Eben bin ich auf den Trichter gekommen den Treiber wie Folgt zu schreiben:
#Treiber = "Microsoft Access Driver (*.mdb, *.accdb)" (!Blank)
und bekomme die Fehlermeldung "Kein zulässiger Dateiname" und das Programm läuft, bis auf die Anzeige der DB Daten, weiter.
Die Fehlermeldung kommt sowohl bei *.MDE als auch bei der *.ACCDB Datei.
Ändere ich die Treiberbezeichnung auf #Treiber = "Microsoft Access Driver (*.mdb)" (ansonsten keine weiteren Änderungen im Source) werden die DB Daten (der *.MDB Datei) angezeigt. ????

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 27.06.2014 12:04
von andi256
Hallo vielleicht hilft dir das ..

Code: Alles auswählen

#SQL_MAX_DSN_LENGTH                 =  32
#ODBC_ADD_DSN    = 1 

#Database = 0

Procedure.s AddDSN_(databasename.s, user.s, pass.s)
 Protected dsn.s, name.s, strDriver.s, strAttributes.s
 Protected L.l, result.l, len
 Protected *buffer.Character
 ; Databasename erzeugen
 name = GetFilePart(databasename)
 name = Left(name, Len(name) - (Len(GetExtensionPart(databasename)) + 1))
 dsn = UCase(Left(name, #SQL_MAX_DSN_LENGTH))
 dbPath.s = GetPathPart(databasename) 
 ; Datenbanktreiber auswählen
 strDriver = "Microsoft Access Driver (*.mdb, *.accdb)"
 ; Attributes erstellen
 strAttributes.s = "Server=APServer;Description=" + name
 strAttributes.s + ";DSN=" + dsn
 strAttributes.s + ";DefaultDir=" + dbPath.s 
 strAttributes.s + ";DBQ=" + databasename
 strAttributes.s + ";UID=" + user
 strAttributes.s + ";PWD=" + pass
 strAttributes.s + ";PageTimeout=5000"   ;standard 5       '??????
 strAttributes.s + ";Threads=5"   ;standard 3
 strAttributes.s + ";"
 *buffer = @strAttributes
 len = Len(strAttributes) - 1
 For L = 0 To len
  If *buffer\c = ';'
   *buffer\c = 0
  EndIf
  *buffer + SizeOf(Character)
Next L

Debug strDriver
Debug strAttributes

 result = SQLConfigDataSource_(#Database , #ODBC_ADD_DSN, strDriver, strAttributes)
 If result
  ProcedureReturn dsn
 Else
  ProcedureReturn ""
 EndIf
EndProcedure

Debug AddDSN_("D:\Datenbank1.accdb","admin","")
#ODBC_ADD_DSN = 1

PS nicht ordentlich getestet

Andi256

Re: Erstellung DSN Access 2007 (*.accdb)

Verfasst: 27.06.2014 15:02
von Pelagio
Ich möchte mich noch einmal für Eure Hilfe bedanken. :bounce:

Ich habe das Problem lokalisiert und müsste eigendlich im Boden versinken bei diesem Patzer.
Mit dem vorherigen Treiber habe ich die Accessdatei ohne Pfad angegeben können, dies scheint jetzt unabdingbar zu sein.
Ich habe mit Pfadangabe sowohl die '*.mde' wie auch die '*.accDB' öffnen können.
:allright: