ich muss arbeitstechnisch mit zwei Exceltabellen arbeiten, die ich vergleiche um eine Ergebnissdatei zu erzeugen. Bisher habe ich die XLTable.dll verwendet, was nicht schön ist, aber leidlich funktioniert.
Die aber wesendlichen Nachteile:
Das Einlesen einer großen Datenbank dauert laaaannnge.
Das Auslesen von "Double" und anderen Variablen ist unmöglich, alleine eine Datumsangabe wird zu eine interessanten Zifferfolge, von Umlauten ganz zu schweigen!
Kurzum etwas anderes muss her.
Ich habe mich daher einmal etwas mit dem ODBC Dateisystem beschäftigt und mir fehlt nur noch die Möglichkeit den Namen der "Tabelle" einer Exceldatei auszulesen. Natürlich kann ich die Exceldatei mit Excel öffnen und den Tabellennamen "lesen". Es muss doch aber eine einfache andere Möglichkeit geben...
In der Beispieldatei heißt meine Tabelle "German users 030406", aber woher nehmen wenn man diesen Namen nicht kennt?
Mein Beispielcode:
Code: Alles auswählen
; English forum:
; Author: Rings (updated for PB3.92+ by Lars)
; Date: 05. May 2003
; Notes: This example works fine for Access, if you want to make a DSN connection to a MsSQL 2000 Server
; then create your dsn by hand or read the docu about M$-sql-server carefully.
; Enhanced Database example
;by Siegfried Rings (CodeGuru)
; little changes from Michael Paulwitz works with PB4.00
; Date: 19.7.2006
File$ = "C:\TestDB.mdb"
#ODBC_ADD_DSN = 1 ; Add Data source
#ODBC_CONFIG_DSN = 2 ; Configure (edit) Data source
#ODBC_REMOVE_DSN = 3 ; Remove Data source
Procedure Makeconnection(Driver.s,strAttributes.s)
Result=OpenLibrary(1,"ODBCCP32.DLL")
If Result
lpszDriver.s=Driver
MyMemory=AllocateMemory(Len(strAttributes))
CopyMemory(@strAttributes,MyMemory,Len(strAttributes))
For l=1 To Len(strAttributes )
If PeekB(MyMemory +l-1)=Asc(";"):PokeB(MyMemory +l-1,0): EndIf
Next l
Result = CallFunction(1, "SQLConfigDataSource", 0,#ODBC_ADD_DSN,lpszDriver.s,MyMemory )
NewResult=SQLConfigDataSource_(0,#ODBC_ADD_DSN,lpszDriver.s,MyMemory )
FreeMemory(MyMemory)
CloseLibrary(1)
If Result
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure DeleteConnection(Driver.s,DSN.s)
Result=OpenLibrary(1,"ODBCCP32.DLL")
If Result
lpszDriver.s=Driver
strAttributes.s = "DSN="+DSN
Result = CallFunction(1, "SQLConfigDataSource", 0,#ODBC_REMOVE_DSN,lpszDriver.s,strAttributes )
CloseLibrary(1)
If Result
ProcedureReturn 1;MessageRequester("Info","DSN Delete",0)
EndIf
EndIf
EndProcedure
MeinPointer.l
Procedure GetDBHandle()
Shared MeinPointer.l
!EXTRN _PB_DataBase_CurrentObject;_PB_DataBase_CurrentObject
!MOV dword Eax,[_PB_DataBase_CurrentObject]
!MOV dword [v_MeinPointer], Eax
ProcedureReturn MeinPointer
EndProcedure
File$ = OpenFileRequester("PureBasic - Open", GetCurrentDirectory()+"*.xls", "Microsoft Access (*.mdb)|*.mdb;*.bat|Microsoft Excel (*.xls)|*.xls", 1)
; File$ = "C:\TestDB.mdb"
If File$<>""
;MessageRequester("Information", "Selected File: "+File$, 0);
Else
End
EndIf
EXT.s=UCase(GetExtensionPart(File$))
Select EXT
Case "MDB"
Result=Makeconnection("Microsoft Access Driver (*.mdb)","Server=SomeServer; Description=Description For Purebasic MDB-ODBC;DSN=PureBasic_DSN;DBQ="+File$+";UID=Rings;PWD=Siggi;")
Case "XLS"
Result=Makeconnection("Microsoft Excel Driver (*.xls)","DSN=PureBasic_DSN;Description=Description For Purebasic Excel;FileType=Excel97;DBQ="+File$+";")
EndSelect
If InitDatabase() = 0
MessageRequester("Error", "Can't initialize Database (ODBC v3 or better) environment", 0)
End
EndIf
OpenConsole()
Dim DatabaseType.s(5)
DatabaseType(0) = "Unknown" ; Unbekannt
DatabaseType(1) = "Numeric" ; Numerisches Format: Long (.l) in PureBasic
DatabaseType(2) = "String" ; String-Format: String (.s) in PureBasic
DatabaseType(3) = "Float" ; Numerisches Fließkomma-Format: Float (.f) in PureBasic
DatabaseType(4) = "Double" ; Numerisches Double-Format: Double (.d) in PureBasic
DatabaseType(5) = "Quad" ; Numerisches Quad-Format: Quad (.q) in PureBasic
; First, let's see which drivers are attached to the system..
;
PrintN("Available drivers:")
PrintN("")
If ExamineDatabaseDrivers()
While NextDatabaseDriver()
PrintN(DatabaseDriverName()+" - "+DatabaseDriverDescription())
Wend
EndIf
; Open an ODBC database
;
;'If OpenDatabaseRequester(0)
User$=""
Password$=""
#Database=1
Result = OpenDatabase(#Database, "PureBasic_DSN", User$, Password$)
If Result
Browse$="Select * from [German users 030406$]"
; [German users 030406$] wie bekomme ich diesen Tabellennamen automatisch raus wenn ich Ihn nicht kenne?!?
PrintN("")
PrintN("Database successfully opened !")
PrintN("Type EXIT to quit.")
PrintN("or anything else to browse database")
Repeat
Command$ = Input()
Select UCase(Command$)
Case "EXIT"
Quit = 1
Default
If DatabaseQuery(#Database,Browse$)
NbColumns = DatabaseColumns(#Database)
PrintN("NbColums: " + Str(NbColumns))
; only for information
For k=0 To NbColumns-1
PrintN(DatabaseColumnName(#Database,k) + " - " + DatabaseType(DatabaseColumnType(#Database,k)))
Next
; Read all database informations
While NextDatabaseRow(#Database)
For k=0 To NbColumns-1
Select DatabaseColumnType(#Database,k)
Case 1
Print ( Str(GetDatabaseLong(#Database,k))+"/")
Case 2
Print ( GetDatabaseString(#Database,k)+"/")
Case 3
Print ( Str(GetDatabaseFloat(#Database,k))+"/")
Case 4
Print ( Str(GetDatabaseDouble(#Database,k))+"/")
Case 5
Print ( Str(GetDatabaseQuad(#Database,k))+"/")
Default
Print ("unknown information/")
EndSelect
Next
PrintN("")
Command$ = Input() ; The next database entry please
Wend
PrintN("")
Print ("Press return to continue") : Input()
PrintN("")
PrintN("Query Result -------------------------------------")
PrintN("--------------------------------------------------")
Else
PrintN("Bad Query !")
EndIf
EndSelect
Until Quit = 1
Else
MessageRequester("Info", "Operation canceled", 0)
EndIf
;and delete:
DeleteConnection("Microsoft Access Driver (*.mdb)","PureBasic_DSN")
; ExecutableFormat=Windows
; FirstLine=1
; EOF