Erstellung DSN Access 2007 (*.accdb)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Erstellung DSN Access 2007 (*.accdb)

Beitrag 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.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag von Kiffi »

a²+b²=mc²
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag 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:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag 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
a²+b²=mc²
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag 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. ????
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag 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
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Erstellung DSN Access 2007 (*.accdb)

Beitrag 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:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Antworten