Excel 10 über ODBC Auslesen

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

Excel 10 über ODBC Auslesen

Beitrag von Pelagio »

Hallo,

in einem Programm erstelle ich eine DSN für eine Exceldatei (2003) die ich dann auslese, was auch bis dato gut Funktionierte.

Code: Alles auswählen

   #DLL      = "ODBCCP32.DLL"
   #Treiber  = "Microsoft Excel Driver (*.xls)
   #Function = "SQLConfigDataSource"

   Enumeration
      #Database
      #ADD_DSN     ; Add Data source
      #CONFIG_DSN  ; Configure (edit) Data source
      #REMOVE_DSN  ; Remove Data source
   EndEnumeration

   Procedure.a DSN_Create(vFiles.s)
      Protected n.i, pAttributes.s, *pMemory, pResult.a
      Protected pTreiber.s  = #Treiber

      If OpenLibrary(1, #DLL)
         pAttributes = "Server=SomeServer; Description=Description For Purebasic Excel-ODBC;DSN=PBExcel_DSN;DBQ=" + vFiles + ";UID=;PWD=;"
         *pMemory = AllocateMemory(Len(pAttributes))
         CopyMemory(@pAttributes,*pMemory,Len(pAttributes))
         For n=1 To Len(pAttributes)
            If PeekB(*pMemory+n-1)=Asc(";"): PokeB(*pMemory+n-1, #False): EndIf 
         Next n
         If CallFunction(1, #Function, #False, #ADD_DSN, @pTreiber, *pMemory)
            pResult = #True
            SQLConfigDataSource_(0, #ADD_DSN, pTreiber, *pMemory)
         EndIf
         FreeMemory(*pMemory): CloseLibrary(1)
      Else
         Debug "ERROR"
      EndIf
      ProcedureReturn pResult
   EndProcedure 

   DSN_Create(Test.xls) ; DSN wird erstellt und ich kann die Daten der Exceldatei lesen
Seid einiger Zeit habe ich aber eine neuere Version von Excel (2010) und habe diesbezüglich meine Exceldatei (*.xls) in das neue Format (*.xlsx) geändert.
Leider kann ich seitdem die Daten nicht mehr auslesen. Ich habe das Problem bis dahin Analysiert, das es nicht funktioniert da keine DSN erstellt wird.

Code: Alles auswählen

   #DLL      = "ODBCCP32.DLL"
   #Treiber  = "Microsoft Excel Driver (*.xls,*.xlsx,*.xlsm,*.xlsb)"  ;(*.xls)->Funktioniert auch nicht
   #Function = "SQLConfigDataSource"

   Enumeration
      #Database
      #ADD_DSN     ; Add Data source
      #CONFIG_DSN  ; Configure (edit) Data source
      #REMOVE_DSN  ; Remove Data source
   EndEnumeration

   Procedure.a DSN_Create(vFiles.s)
      Protected n.i, pAttributes.s, *pMemory, pResult.a
      Protected pTreiber.s  = #Treiber

      If OpenLibrary(1, #DLL)
         pAttributes = "Server=SomeServer; Description=Description For Purebasic Excel-ODBC;DSN=PBExcel_DSN;DBQ=" + vFiles + ";UID=;PWD=;"
         *pMemory = AllocateMemory(Len(pAttributes))
         CopyMemory(@pAttributes,*pMemory,Len(pAttributes))
         For n=1 To Len(pAttributes)
            If PeekB(*pMemory+n-1)=Asc(";"): PokeB(*pMemory+n-1, #False): EndIf 
         Next n
         If CallFunction(1, #Function, #False, #ADD_DSN, @pTreiber, *pMemory)
            pResult = #True
            SQLConfigDataSource_(0, #ADD_DSN, pTreiber, *pMemory)
         EndIf
         FreeMemory(*pMemory): CloseLibrary(1)
      Else
         Debug "ERROR"
      EndIf
      ProcedureReturn pResult
   EndProcedure

   DSN_Create(Test.xlsx) ; CallFunction Rückgabewert = 0
Vielleicht kann mir jemand diesbezüglich erklären wieso es nicht mehr funktioniert. :praise:
Zuletzt geändert von Pelagio am 23.06.2013 17:40, insgesamt 1-mal geändert.
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: Excel 10 über ODBC Auslesen

Beitrag von Kiffi »

so auf Anhieb sehe ich auch nichts Verkehrtes.

Vielleicht versuchst Du mal diesen Code von srod, mit dem ich bisher keine Probleme hatte:

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

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Excel 10 über ODBC Auslesen

Beitrag von ts-soft »

>> DSN_Create(Test.elsx) ; CallFunction Rückgabewert = 0
Vielleicht liegt es auch an der Datei-Extension? elsx kenne ich auch nicht :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
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: Excel 10 über ODBC Auslesen

Beitrag von Pelagio »

Tschuldigung ts-soft,

Tippfehler *.elsx = *.xlsx, *.els = *.xls habe ich schon oben geändert. :praise:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
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: Excel 10 über ODBC Auslesen

Beitrag von Pelagio »

Hallo Leute,
das Problem besteht immer noch allerdings konnte ich es auf den Treiber reduzieren.
Wenn ich den Treiber 'Microsoft Excel Driver (*.xls)' benutze, kann ich die Daten auslesen, benutze ich aber den Treiber für die Excel-Versionen > 2003 'Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)' so sagt mir DataBaseError:
[Microsoft][ODBC-Treiber für Excel] Das Microsoft Office Access-Datenbankmodul konnte das Objekt '2006$A1:AG37' nicht finden. Stellen Sie sicher, dass das Objekt vorhanden ist und dass die Namens- und Pfadangaben richtig eingegeben wurden.
Ich habe zwar schon nach irgendwelche Geistesblitze gegoogelt aber bis dato nichts gefunden. Vielleicht weiß ja jemand von Euch ob die SQL-Anweisung (SELECT * FROM [2006$A1:AG37] ) in einer anderen Art und Weise geschrieben werden muss.
>_< :praise:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
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: Excel 10 über ODBC Auslesen

Beitrag von Pelagio »

:bounce:
Problem gelöst.
Mit dem neuen Treiber [Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)] ist es dringend notwendig bei der Übergabe des Exceldateinamens den gesamten Pfad mit anzugeben. Mit dem alten Treiber [Microsoft Excel Driver (*.xls)] konnte darauf verzichtet werden wenn die Exceldatei im gleichen Verzeichnis stand wie das Programm.

Code: Alles auswählen

 #Treiber  = "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)"

   Enumeration
      #Database
      #ADD_DSN     ; Add Data source
      #CONFIG_DSN  ; Configure (edit) Data source
      #REMOVE_DSN  ; Remove Data source
   EndEnumeration

   Define.c mNKS = 2
   Define.s mCON, mDSN = "PBExcel_DSN"

; Datenbank (Excel DSN) Initialisieren
; OK = DSN_Create(Files.s)
   Procedure.a DSN_Create(vFiles.s)
      Shared mDSN, mCON
      Protected pResult.a

      mDSN = ReplaceString(GetFilePart(vFiles),".","_")
      mCON = "Server=SomeServer; Description=Description For Purebasic Excel-ODBC;DSN=" + mDSN + ";DBQ=" + vFiles + ";UID=;PWD=;"
      If SQLConfigDataSource_(#Database, #ADD_DSN, #Treiber, mCON)
         pResult = #True
      EndIf
      ProcedureReturn pResult
   EndProcedure 

; Datenbank (Excel DSN) schließen
; OK = DSN_Delete()
   Procedure.a DSN_Delete()
      Shared mCon
      Protected pResult.a

      If SQLConfigDataSource_(#Database, #REMOVE_DSN, #Treiber, mCON)
         pResult = #True
      EndIf
      ProcedureReturn pResult
   EndProcedure 

-----------------------------------------------------------------------------------------

Global DBFile.s = GetPathPart(ProgramFilename()) + "PB_ExcelTest.xlsx"
If DSN_Create(DBFile)
      If OpenDatabase(#DBID, .....)
         ...................
         CloseDatabase(#DBID)
      EndIf
      DSN_Delete()
   Else
     MessageRequester("Info", "Operation canceled", 0)
   EndIf
Jetzt hab ichs verdient :coderselixir:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Antworten