-
Und nun noch ein paar Ergänzungen:
Der MSDASQL-OLEDB-Treiber stammt noch aus Zeiten vor ODBC 3.51. Erst ab ODBC 3.51 wird auch Unicode beim Lesen unterstützt.
Für das Senden von Unicode ist das ja kein Problem, da du ja Parameter gezielt mit adVarWChar definieren kannst.
Laut SQL-Trace bindet der MSDASQL leider bei einem Recordset mit adChar so dass Unicode eben verloren geht.
Excel selber verwendet die neu Jet-Engine 4.0 mit SQL-Pasthru-Abfragen.
Hier funktioniert das Binden also mit adVarWChar so dass Unicode funktioniert.
Um also dein AddIn dynamisch zu machen, füllst du die Connection-Egenschaft des QueryTable-Objekts mit "ODBC;Verbindungsfolge", den CommandText und wendest die Methode Refresh an.
Vor mehreren Verbindungen brauchst du keine Angst zu haben, da der ConnectionPool standardmäßig aktiviert ist.
Bei der Verwendung des IBMDA400/IBMDASQL muss leider in der Verbindungsfolge die Konvertierung von DateTime gezielt ausgeschaltet werden:
IBM i Support: Software Technical Document : 23062121
Convert Date Time to Char = False;
-
Hallo,
ich habe jetzt noch eine Menge Tests durchgeführt und dabei einige neue Erkenntnisse gewonnen.
QueryTable:
1.) Beim QueryTables.Add kann ich bekanntlich als Datenquelle ein ADODB.Recordset angeben. Wenn dieses Recordset als erste Spalte jedoch ein numerisches Feld enthält, wird die erste Spalte seltsamerweise ignoriert bzw. alle führenden numerischen Spalten werden ignoriert. Wenn das Recordset z.B. als erste Spalte ein Char-Feld enthält, funktioniert's problemlos.
2.) Wenn ich beim QueryTables.Add direkt einen ODBC-Connectionstring angebe, passt zwar das Ergebnis. Allerdings wird jedes Mal eine neue ODBC-Verbindung hergestellt. Ich weiß nicht wie Du darauf kommst, dass Connection Pooling automatisch funktioniert. Aber das stimmt nicht. Jeder Aufruf hat bei mir 1-2 Sekunden gedauert. Connection Pooling muß man laut Microsoft erst aktivieren. das habe ich auch gemacht und würde auch funktionieren (Zeitmessung dann nur noch im Hundertstelsekunden-Bereich). Allerdings scheitert dann der QueryTables.Add wegen "allgemeinem ODBC-Fehler" ohne nähere Erläuterung.
OLE DB:
Bei der OLEDB-Verbindung funktionieren durch die Einstellung des Verbindungsparameters Convert Date Time To Char=FALSE nun auch die Datumsfelder richtig. Aber wie gesagt gibt es hier die Probleme mit dem Recordset im QueryTables.Add, wenn das Recordset mit numerischen Felders beginnt. Dies kann ich aber umgehen, wenn ich die Ergebnisse des Recordsets mit CopyFromRecordset statt QueryTable in die Ziel-Tabelle einfüge. Damit funktioniert's nämlich.
Unicode-Texte:
Bei der OLEDB-Verbindung erhalte ich die Unicode-Texte korrekt zurück. Bei der ODBC-Verbindung erhalte ich sie nur, wenn ich die ODBC-Verbindung direkt beim QueryTables.Add angebe. Wenn ich erst einen Recordset damit fülle, werden die Felder als adChar interpretiert.
Ich hab mir mal die Treiber-Einstellungen angeschaut, konnte allerdings die Screenshots hier nicht hochladen. Auffällig war z.B., dass bei der ODBC-Verbindung die OLE-DB-Version auf 2.00 stand, während sie bei der OLEDB-Verbindung auf 2.50 stand. Das könnte die Ursache für die Unicode-Probleme sein. Die ODBC-Treiber-Version stand auf 3.51 und müsste dafür ausreichend sein.
Um alle meine Probleme in dieser Sache zu lösen, werde ich nun also den OLEDB-Treiber mit Recordset und zum Daten einfügen den CopyFromRecordset verwenden. Somit kann ich alle Feldtypen verarbeiten, die Daten korrekt in die Ziel-Tabelle einfügen und auch aus Performance-Gründen die Connection offen halten.
Gruß,
KM
-
Hier sind jetzt doch noch die Treiber-Einstellungen:
ODBC
ADO Version: 2.8
DBMS Name: DB2/400 SQL
DBMS Version: 05.04.0014
OLE DB Version: 02.00
Provider Name: MSDASQL.DLL
Provider Version: 02.81.1132.0
Driver Name: CWBODBC.DLL
Driver Version: 05.04.0120
Driver ODBC Version: 03.51
OLE-DB
ADO Version: 2.8
DBMS Name: DB2 UDB for iSeries
DBMS Version: 05.04.0000 OS/400 V5R4M0
OLE DB Version: 02.50
Provider Name: cwbzzodb.dll
Provider Version: 11.00.1200
Vielleicht kann da ja noch jemand etwas "herauslesen" bzw. Vorschläge machen wie man die ODBC-Variante aktualisieren kann.
Gruß,
KM
-
Die OLE DB Version ist die Version des OLEDB-Treibers, eben 2.00 für MSDASQL, 2.50 für IBMDA400/IBMDASQL.
Similar Threads
-
By SchoberS in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 17-01-08, 10:08
-
By c.b. in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 26-07-06, 13:22
-
By sim in forum NEWSboard Programmierung
Antworten: 11
Letzter Beitrag: 18-05-06, 09:00
-
By antonkuh in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 24-04-06, 11:37
-
By Heinz Molter in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 31-08-04, 10:48
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks