Wir haben bei der Arbeit eine ziemlich unglückliche Legacy-Anwendung, die ursprünglich in VB6 geschrieben wurde und mindestens 5 Jahre älter ist als jeder in unserer IT-Abteilung. Wir haben einen Vertragsentwickler für die laufende Wartung und wo er kann, schreibt er Abschnitte in .NET-Code um (ich bin mir über seine Techniken hier nicht sicher, dies ist ein Nebenjob zu seiner regulären Arbeit als IBM-Ingenieur). Die Anwendung funktioniert (so wie sie ist) unter Windows XP einwandfrei. Wir haben nur ein paar Windows 7-Rechner, hauptsächlich zum Testen, und diese Anwendung scheint gegen eine Wand zu laufen. Dinge wie der Hintergrund, der nicht geladen wird, und SQL-Fehler. Dies läuft sogar als Administrator.
Das Ausführen einer SQL-Ablaufverfolgung über das ODBC-Kontrollfeld zeigt mehrere interessante Dinge. Zunächst wird erfolgreich eine Verbindung zur Datenbank hergestellt und eine Abfrage ausgeführt, um festzustellen, ob die richtige Version ausgeführt wird. Diese Abfrage funktioniert einwandfrei.
558-1af0 ENTER SQLExecDirectW
HSTMT 0x020D7548
WCHAR * 0x04C8F0F0 [ 115] "SELECT count(*) c FROM tblSoftwareVersion WHERE fldSoftwareVersion = '123456' AND fldSoftwareName = 'Application.VB'"
SDWORD 115
BMS 558-1af0 EXIT SQLExecDirectW with return code 1 (SQL_SUCCESS_WITH_INFO)
HSTMT 0x020D7548
WCHAR * 0x04C8F0F0 [ 115] "SELECT count(*) c FROM tblSoftwareVersion WHERE fldSoftwareVersion = '123456' AND fldSoftwareName = 'Application.VB'"
SDWORD 115
Dann scheint die Verbindung zu trennen und die ODBC-Verbindung kann nicht gefunden werden, obwohl sie mit derselben Datenbank verbunden ist. Aus der Ablaufverfolgung geht hervor, dass die Verbindung konfiguriert wird, dann SQLFreeStmt ausgelöst wird, um die Verbindung zu lösen und zu schließen. Wenn die Anwendung dann versucht, ihre Aufgabe zu erledigen, besteht keine Verbindung.
558-1af0 ENTER SQLFreeStmt
HSTMT 0x020D7548
UWORD 2 <SQL_UNBIND>
BMS 558-1af0 EXIT SQLFreeStmt with return code 0 (SQL_SUCCESS)
HSTMT 0x020D7548
UWORD 2 <SQL_UNBIND>
Dann passiert dies, wenn ich versuche, etwas zu tun, das Daten zieht
558-1af0 ENTER SQLDriverConnectW
HDBC 0x020DDA00
HWND 0x00000000
WCHAR * 0x73EF8634 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73EF8634
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
BMS 558-1af0 EXIT SQLDriverConnectW with return code -1 (SQL_ERROR)
HDBC 0x020DDA00
HWND 0x00000000
WCHAR * 0x73EF8634 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73EF8634
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0)
Fast alle meine Recherchen zu diesem Thema stoßen auf Programmierprobleme, bei denen die Verbindungszeichenfolge ein Problem aufweist. Der einzige Unterschied in diesem speziellen Szenario ist jedoch Windows 7. Ich weiß, dass die Verbindungszeichenfolge in Ordnung ist, da sie auf den XP-Rechnern funktioniert. Die VB-Komponenten sollten unter Win7 weiterhin funktionieren. Auf meinem Computer läuft Win7 32-Bit und auf meinem VP Win7 64-Bit und beide haben dasselbe Problem, das kann also ausgeschlossen werden.
Ich habe bereits versucht, den SQL Native Client und die VB-Runtime sowie die betreffende Anwendung neu zu installieren. Hoffentlich kann ich eine Lösung finden und muss nicht auf die XP-VM zurückgreifen.
Bearbeiten - Nun, nach vielen Versuchen mussten wir uns hier für die XP VM als Lösung entscheiden. Entweder sind die VB-Komponenten nicht so kompatibel wie behauptet, oder diese alte App macht etwas Seltsames.
Antwort1
Wenn es sich um eine Anwendung handelt, die vom Desktop aus ausgeführt wird (also nicht als Dienst), haben Sie versucht, die Anwendung so einzustellen, dass sie im Kompatibilitätsmodus ausgeführt wird? Ich hatte ein ähnliches Problem mit einem VB6-Programm (dieselbe Funktion zum Lesen der Registrierung wird von zwei verschiedenen Teilen des Programms aus aufgerufen, einer funktioniert, der andere nicht, aber von der VB6-IDE aus funktionieren beide) und einfach mit der rechten Maustaste zu klicken und Win7 auf Kompatibilität testen zu lassen und den XP SP2-Modus auszuwählen, hat das Problem behoben.
Antwort2
Der XP-Modus war letztendlich die einzige Lösung, die funktionieren würde.