Excel ODBC Treiber findet Tabelle nicht
-
Hallo Leute!
Ich weis, es ist etwas umständlich, aber es soll so sein.
Ich möchte über ODBC auf eine Excel Tabelle zugreifen und habe mir auch die netsprechende Datenquelle erstellt. Funzt auch alles soweit bis auf das Open() vom Recordset:keys.Open(CRecordset::snapshot,"Select * from NameTabele Where Name = 'Heinz'");Das schlägt fehl, weil er "NameTable" nicht kennt, obwohl die Tabelle im Excel genau so heißt. Ich hba dann mal in den Standard SQL String geschaut im erstelletn CRecordset, da stand drin
return _T("[Tabelle1$]");Wenn ich jetzt in mein SQL Statement reinschreibe:
keys.Open(CRecordset::snapshot,"Select * from Tabelle1$ Where Name = 'Heinz'");Dann bekomme ich den Fehler: "Fehler in der FROM Klausel!"
Kann mir jemand helfen??
Gruß und Dank Ranger
-
versuch mal
keys.Open(CRecordset::snapshot,"Select * from [Tabelle1$] Where Name = 'Heinz'");und hier noch ein paar Hinweise:
Excel:
1.Generelles:
-Am einfachsten connected man mit Hilfe des „Excel-Dateien“-Treibers, eine
eigene DSN zu erstellen macht wenig Sinn, da es sich dabei sowieso um einen
ganz normalen Excel-Treiber handelt. Außerdem erspart man sich dadurch die
lästigen „Extended Properties“, die so nicht gesetzt werden müssen. „READONLY“
muss so auch nicht explizit auf FALSE gesetzt werden. Der eigentliche
ConnectionString bleibt kurz und übersichtlich und leistet dabei dasselbe wie
eine eigene DSN.-Tabellennamen werden grundsätzlich in eckige Klammern gepackt. Dabei muss der
Tabellenname immer mit einem „“-Zeichen abgeschlossen werden. Das gilt für alle SQL-Befehle, nicht nur für „Select“ ! Beispiel : [MyTable]. Die MSDN
behauptet, man könne auch ohne eckige Klammern auf „Ranges“ zugreifen. Das mag
für VB gelten, bei Delphi hatte ich bis jetzt noch keinen Erfolg. Bleibe aber
weiter dran...-Excel-Tabellen können grundsätzlich nur einmal geöffnet werden. Das sollte
beim Debuggen berücksichtigt werden. Eine Connection, die auf TRUE steht, kann
stören. Meines wissens nach ist es auch nicht möglich, besagte Tabelle ein
zweites mal im Exclusiv-Modus zu öffnen.2. Einen Connect ausführen
-Ein typischer ConnectionString sieht in etwa so aus:-ConnectionString := ’Provider=MSDASQL;Data Source=Excel-Dateien;Initial
Catalog=C:\myTable.XLS;’-Mehr ist nicht nötig, man glaubt es kaum...
3. CREATE DATABASE
-Ein CREATE DATABASE ist nicht so ohne weiteres anwendbar. Man muss einen
kleinen Trick anwenden. Man connected auf eine Datei, die bis jetzt noch nicht
existiert. Dann führt man einen CREATE TABLE aus. Der Treiber erzeugt dann
automatisch die .XLS-Datei. Die DataBase (sprich das XLS-File) heißt dann so,
wie zuvor angegeben.4. CREATE TABLE
-Hier gilt es zu berücksichtigen, dass außer dem Tabellennamen auch die
Feldnamen in eckigen Klammern stehen müssen! Excel kennt eine Vielzahl von
Formaten, darunter VARCHAR, DOUBLE, CURRENCY oder DATETIME. Einen Typ "int"
gibt es nicht! Zahlen werden generell als "Double" angegeben. Ein typischer
CREATE TABLE könnte so aussehen:-CREATE TABLE [myTable$] ([Name] varchar(50), [Vorname] varchar(50), [PLZ]
Double, [GeburtsDatum] DateTime)-Die Feldnamen erscheinen im Worksheet dann in der ersten Zeile. Die msdn
behauptet, man könne mit "FirstRowHasNames" die erste Zeile zu einem weiteren
Datensatz machen, ich hatte bisher keinen Erfolg damit.5. Zugriff & Manipulation
-Zugegriffen und manipuliert wird auf ganz normale Art und Weise. Bei
einem "Insert" können jetzt auch die eckigen Klammern weggelassen werden. Beispiel:-INSERT INTO (Name, Vorname, PLZ, GeburtsDatum) values (’Müller’, ’Martin’, 74523, 22.02.02)
-ansonsten funktioniert alles im SQL-typischen Stil.
6. Abschließendes
-als sehr kooperativ erweist sich Excel mit Datums- und Currency-Werten. Wenn
man die Felder bereits richtig definiert, kann man auch mit Sicherheit davon
ausgehen, dass alle Zellen richtig formatiert und angezeigt werden. Hier
leistet der Treiber ausgezeichnete Arbeit.-Leider ist es IMHO nicht möglich, den Feldtyp VarChar(x) richtig zu
beeinflussen. Excel macht sich nichts aus der Größe x, es legt sich
anscheinend soviel Speicherplatz an chars zurecht, wie es (Excel) meint, zu
benötigen. Wenn man die Daten dann im Excel anschaut, ist das kein Problem;
wird allerdings versucht, die Daten mit einem Grid anzuzeigen, gibt das Probleme, weil die Felder überdurchschnittlich groß geraten sind.-stets beachten sollte man auch, dass Excel nicht in der Lage ist, mehr als
65535 Datensätze zu speichern. Das ist aber ein Problem der Excel-Philosophie.7. Wichtiges
-Ein SELECT * FROM kann nicht ausgeführt werden. Woher sollte Excel auch
wissen, wann das Ende der Feldnamen erreicht ist? Und wenn, was würde es dann mit leeren Einträgen machen, die im Excel ja durchaus zulässig sind?for allem der letzte dürfte hilfreich sein

-
Danke, das genügt, ich mach es mit Access, da weis ich dass es geht.


Danke, Ranger
-
-
Ach ja und evtl auch wichtig: total sinnloser weise unterstützt Excel kein DELETE FROM (steht auch so in der MSDN)