Seite 1 von 1

ODBC Treiber

Verfasst: Sa, 12. Jan 2013 12:22
von saul
Guten Morgen,
in einer Anwendung benutze ich den ODBC Treiber von Avantage (weil da die Umlaute richtig sortiert werden) für 32bit Programme um mit Boris Borzic SQL Express auf Daten zuzugreifen. Nun habe ich einen Windows Server 64bit. Das Programm läuft darauf, daber der Datenzugriff via SQL Express bricht mit einer Fehlermeldung ab
[Microsoft][ODBC Driver Manager] Der angegebene DSN weist eine nicht übereinstimmende Architektur von Treiber und Anwendung auf.
Was kann ich da tun?

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: Sa, 12. Jan 2013 12:45
von brandelh
Ich denke man muß den 32 Bit Treiber installieren, vermutlich ist auf dem Server nur der 64 Bit aktiv.
Ähnliches gilt z.B. für JAVA, dort soll man immer die 32 Bit Runtime installieren damit keine Probleme entstehen.

Re: ODBC Treiber

Verfasst: Sa, 12. Jan 2013 13:22
von saul
Hallo,
das habe ich versucht, funktioniert aber nicht.

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: Sa, 12. Jan 2013 14:00
von georg
Hallo, Wolfgang -


wie greifst Du auf den ODBC-Treiber zu? Über CONNECT-String? Über eine DSN? Wenn über eine DSN, kannst Du z.B. von Excel aus über die DSN auf Daten zugreifen?

Re: ODBC Treiber

Verfasst: Sa, 12. Jan 2013 14:30
von saul
Hallo,

Code: Alles auswählen

  odbc_treiber:=SQLConnection():new(Kundlag,,,.t.)       // Kundlag Name der ODBC Dbase Datenbank
  oCursor:=SQLSelect():new( chselect, odbc_treiber)
  nSuccess := oCursor:execute() // don't really need to execute an SQLDataSet, it's just here for consistency
Wie greift man mit Execel aus über die DSN auf die Daten zu?

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: Sa, 12. Jan 2013 15:43
von georg
Hallo, Wolfgang -


so mache ich es:

Code: Alles auswählen

   oConX := SQLConnection():new()
   cLine := "Driver={" + SQLUGetDriverName("EXCEL", oConX) + "};ReadOnly=0;MaxScanRows=0;FirstRowHasNames=1;FIL=excel 8.0;DBQ=" + cXFile + ";"
   IF !oConX:driverConnect(NIL, cLine)
      ConfirmBox(, "Could not connect to Excel subsystem (ODBC)", "Error", XBPMB_OK, XBPMB_INFORMATION)
      RETU(.F.)
   ENDIF
SQLUGetDriverName() holt mir aus der Liste der installierten Treiber den (ersten) Treiber raus, der "EXCEL" im Namen hat. cXFile ist der Name der Excel-Datei, die zu öffnen ist.

Das ist übrigens die CONNECT-String Methode, die ich vorziehe, da keine DSN vorhanden sein muss.

So erstelle ich dann ein Arbeitsblatt mit dem Namen OverView:

Code: Alles auswählen

   cLine := "CREATE TABLE Overview (Area VARCHAR, Record FLOAT, Findings VARCHAR)"
   oCur1 := SQLSelect():new(cLine)
   oCur1:execute()
Und so schreibe ich einen Satz in das SQLSelect():

Code: Alles auswählen

   aSet := {"BaseHist", nBaseRecs, ""}
   oCur1:append()
   oCur1:recordPut(aSet)
   oCur1:updateRow()
Das ist der Quelltext für SQLUGetDriverName():

Code: Alles auswählen

#DEFINE FALSE .F.
#DEFINE TRUE  .T.

#INCLUDE "Xbp.CH"

#PRAGMA Library("SQLXPP.LIB")

FUNCTION SQLUGetDriverName(cDriver, oConn)
   Local lCreated, aList, nLen, nI, cLook4, cName
   cDriver := Upper(cDriver)
   cName := ""
   lCreated := FALSE
   IF oConn == NIL
      oConn := SQLConnection():new()
      lCreated := TRUE
   ENDIF
   aList := oConn:getDrivers()
   nLen := Len(aList)
   FOR nI := 1 TO nLen
      cLook4 := Upper(aList[nI, 1])
      IF At(cDriver, cLook4) > 0
         cName := aList[nI, 1]
         EXIT
      ENDIF
   NEXT
   IF lCreated
      oConn:destroy()
   ENDIF
RETURN (cName)

Weitere Fragen?

Re: ODBC Treiber

Verfasst: So, 13. Jan 2013 13:51
von saul
Hallo Georg,
da bin ich jetzt ein wenig verwirrt. Ist Dein Code um mit Xbase++ auf Excel Tabellen zuzugreifen?

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: So, 13. Jan 2013 15:12
von georg
Hallo, Wolfgang -


ja, nein, aber doch.

ODBC ist eine Schnittstelle, mit der jede Datei, die ODBC versteht, sich wie ein SQL-Server verhält, mal ganz platt formuliert.

Sobald über eine DSN oder einen Connect-String eine Verbindung da ist, kann man mit allen Datenquellen in (fast) der gleichen Art und Weise kommunizieren.

Soweit die Theorie. Jede Datenquelle hat ihre eigenen Regeln, das gilt besonders für Microsoft Excel.

Ich hatte Deine Frage so verstanden, dass Du u.a. wissen wolltest, wie man mit SQLExpress auf Excel zugreift. Mein Beispiel ist die einfachste Variante, erstellen einer Datei (das geht beim :driverConnect() automatisch), Erstellen eines Arbeitsblattes, und Befüllen.

Wenn man auf bestehende Excel-Tabellen lesend zugreifen will, sind auch bestimmte Formen (wie Adressierung etc.) zu beachten, die müsste ich aber erst aus Programmen raussuchen, wo ich das mache.

Re: ODBC Treiber

Verfasst: So, 13. Jan 2013 16:07
von saul
Hallo,
nicht ganz.
Ich verbinde das Programm mit dbf Dateien über einen ODBC Treiber. Dann kann ich mit SQL Befehlen wesentlich schneller Datensätze selektieren. Das klappt mit 32bit Avantage ODBC Treiber einwandfrei. Es gibt auch eine 64bit Variante, die dann aber mit einer Fehler abbricht.

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: Mo, 14. Jan 2013 9:48
von nightcrawler
klar bricht die 64Bit Variante von Xbase++ aus mit einem Fehler ab...XBase++ist 32Bit und kann daher keine 64Bit DLLs verwenden.
Von 32Bit Programmen muß man zwangsläufig auf die 32Bit Treiber zugreifen (µ$ gibt das so vor). Den 32Bit ODBC Manager findet man im SYSWO64 Pfad (Windows\SysWOW64\odbcad32.exe). Witzigerweise (unsinnigerweise) ist Windows\system32\odbcad32.exe die 64Bit Variante.

Re: ODBC Treiber

Verfasst: Mo, 14. Jan 2013 11:14
von brandelh
nightcrawler hat geschrieben:Witzigerweise (unsinnigerweise) ist Windows\system32\odbcad32.exe die 64Bit Variante.
genau, 64 BIT Version mit 32 im Namen und im Pfad system32, das soll noch einer verstehen. =D>

Re: ODBC Treiber

Verfasst: Mo, 14. Jan 2013 11:25
von georg
Hallo,


der ODBC-Manager ist doch egal ...

Entscheidend ist der verwendete Treiber, also 32bit auf 32bit Systemen, und auf 64bit Systemen den Treiber, der zur Architektur des Anwendungsprogramms passt - für Xbase++ Programme also ein 32bit Treiber.

Aber da liegt, soweit ich Wolfgang verstanden habe, sein Problem: der 32bit Treiber will nicht. Leider ist Wolfgang uns eine genauere Beschreibung des Fehlers schuldig geblieben.

Verschiedene Möglichkeiten für den Fehler sehe ich:

er verwendet eine DSN, die für den 64bit Treiber erstellt wurde;
beide Treiber können nicht nebeneinander auf der gleichen Maschine installiert sein.

Re: ODBC Treiber

Verfasst: Mo, 14. Jan 2013 11:48
von nightcrawler
brandelh hat geschrieben:genau, 64 BIT Version mit 32 im Namen und im Pfad system32, das soll noch einer verstehen. =D>
32+32=64, deshalb kommt die Zahl zweimal vor.

Re: ODBC Treiber

Verfasst: Mo, 14. Jan 2013 13:02
von brandelh
Achso, klar doch, wie konnte ich das übersehen :badgrin:

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 12:30
von saul
Hallo,
kennt jemand einen ODBC Treiber, den ich jeweils für W7 32 und 64 Bit verwenden kann?

Anstelle der "set filter" Funktion für große Datenbestände öffne ich die DBF Datei mittels SQLExpress for Xbase++ über einen ODBC Treiber und filtere mit SQL Befehlen. Das geht wesentlich schneller als mit set filter. Ich verwende dafür bisher den Avantage ODBC Treiber, da dieser der einzige ist den ich fand und der die deutschen Umlaute richtig berücksichtigt. Leider funktioniert das nur mit dem 32 Bit Treiber auf einem 32 Bit System. Auf einem 64 Bit Rechner läßt sich der 32 Bit Treiber nicht installierren und der 64 Bit Treiber ergibt eine Fehlermeldung.

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 14:45
von georg
Hallo, Wolfgang -


um den ODBC-Treiber mit Xbase++ nutzen zu können, muss es schon ein 32bit Treiber sein, da 32bit Anwendungen (wie Xbase++) nicht mit 64bit Komponenten kommunizieren können. (Aber das hast Du ja schon festgestellt.)

Theoretisch sollte sich der 32bit Treiber auch auf einem 64bit System installieren lassen, so verwende ich auf meinen 64bit Windows 7 Systemen den 32bit MySQL-Treiber ohne Probleme.

Welche Fehlermeldung bekommst Du denn bei der Installation?

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 15:24
von saul
Hallo Georg,
nach der Installation bekomme ich keine Fehlermeldung. Schaue ich dann unter Programme nach, so finde ich den ODBC Treiber dort vor. Im Unterprogramm ODBC Treiber fehlt der Treiber ab ganz.

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 15:56
von Martin Altmann
Wolfgang,
hast Du denn auch unter dem ODBC32-Treiber der Systemsteuerung geschaut?
In der 64Bit-ODBC-Treibereinstellungen kann der 32Bit-Treiber ja auch nicht auftauchen!

Viele Grüße,
Martin

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 16:04
von saul
Hallo,
ich habe unter Verwaltung->Datenquelle (ODBC) aufgerufen. Wo stellt man denn sonst den 32 bIt Treiber ein?

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 16:06
von Martin Altmann
Moin,
dafür gibt es - meine ich - ein extra Programm im SYSTEM32-Ordner.

Viele Grüße,
Martin

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 16:07
von Martin Altmann
Halt - nein! Der liegt im SYSWOW64-Ordner - also im 64Bit-Ordner ;-) und heißt ebenfalls odbcad32.exe

Viele Grüße,
Martin

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 16:47
von georg
Hallo, Wolfgang -


nach der Installation solltest Du mal folgenden Code ausführen:

Code: Alles auswählen

oCon := SQLConnection():new()
aList := oCon:getDrivers()
FOR nI := 1 TO Len(aList)
   ? aList[nI]
NEXT
aList enthält jetzt eine Liste der ODBC-Treiber, die für Dein Programm verfügbar ist, entscheidend ist jetzt, ob der entsprechende Treiber in der Liste aufgeführt ist oder nicht. Wenn ja, kannst Du ihn auch verwenden.

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 18:09
von saul
Hallo,
Das komische ist, dass bei der Liste ganz andere Treiber aufgelistet sind wie im Feld Treiber.

mfg
Wolfgang

Re: ODBC Treiber

Verfasst: So, 12. Mai 2013 18:43
von georg
Hallo, Wolfgang -


das Ergebnis meines Programmscodes sind die ODBC-Treiber, die für eine Verwendung mit SQLExpress "sichtbar" sind. Weshalb es zu den Abweichungen kommt (z.B. sind die ganzen Office-ODBC-Treiber bei mir auch nicht unter ODBC gelistet), kann ich Dir leider nicht sagen.