Seite 1 von 1

Excel 10 über ODBC Auslesen

Verfasst: 23.06.2013 14:01
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:

Re: Excel 10 über ODBC Auslesen

Verfasst: 23.06.2013 17:09
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

Re: Excel 10 über ODBC Auslesen

Verfasst: 23.06.2013 17:18
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:

Re: Excel 10 über ODBC Auslesen

Verfasst: 23.06.2013 17:44
von Pelagio
Tschuldigung ts-soft,

Tippfehler *.elsx = *.xlsx, *.els = *.xls habe ich schon oben geändert. :praise:

Re: Excel 10 über ODBC Auslesen

Verfasst: 24.06.2013 14:07
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:

Re: Excel 10 über ODBC Auslesen

Verfasst: 25.06.2013 11:19
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: