У нас есть довольно неудачное устаревшее приложение, изначально написанное на VB6, оно опережает всех в нашем ИТ-отделе как минимум на 5 лет. У нас есть разработчик по контракту для текущего обслуживания, и там, где он может, он переписывает разделы в код .NET (не уверен в его методах здесь, это дополнительная работа для его регулярной работы в качестве инженера IBM) приложение работает нормально (например, оно есть) под windows XP. У нас есть всего пара машин с Windows 7 в основном для тестирования, и это приложение, кажется, упирается в стену. Такие вещи, как фон не загружается и ошибки SQL. Это даже работает под администратором.
Выполнение трассировки SQL из панели управления ODBC показывает несколько интересных вещей. Первоначально он успешно устанавливает соединение с базой данных, где запускает запрос, чтобы определить, работает ли она с правильной версией. Этот запрос работает нормально.
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
Затем он, кажется, разрывает свое соединение и не может найти соединение ODBC, несмотря на то, что он подключается к той же БД. Судя по трассировке, похоже, что он настраивает соединение, затем он начинает запускать SQLFreeStmt для отмены привязки и закрытия, а затем, когда он находится в приложении и пытается сделать свое дело, соединение отсутствует.
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>
Затем это происходит, когда я пытаюсь сделать что-то, что извлекает данные
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)
Почти все мои поиски по этой проблеме связаны с проблемами программирования, когда возникает проблема со строкой подключения. Единственное, что отличается в этом конкретном сценарии, - это Windows 7, я знаю, что строка подключения в порядке, поскольку она работает на машинах XP. Предполагается, что компоненты VB по-прежнему будут работать под Win7. Мой компьютер работает под управлением 32-разрядной Win7, а мой вице-президент работает под управлением 64-разрядной версии Win7, и у обоих одинаковая проблема, поэтому ее можно исключить.
Я уже пробовал переустановить собственный клиент SQL и среду выполнения VB, а также соответствующее приложение. Надеюсь, я смогу найти решение и мне не придется прибегать к использованию виртуальной машины XP.
Изменить. После многих попыток мы были вынуждены использовать виртуальную машину XP в качестве решения. Либо компоненты VB не так совместимы, как они утверждают, либо это древнее приложение делает что-то забавное.
Если это приложение, которое запускается с рабочего стола (т.е. не как служба), вы пытались настроить приложение для работы в режиме совместимости? У меня была аналогичная проблема с программой VB6 (та же функция для чтения реестра вызывается из двух разных частей программы, одна работает, другая нет, но из VB6 IDE оба работают) и просто щелкнув правой кнопкой мыши и имея тест Win7 для совместимости и выбор режима XP SP2 вылечили проблему.
Режим XP оказался единственным решением, которое могло сработать.