ekograce Ответов: 1

Проблема Odbc32 после обновления фреймворка в 64 бит.


Всем Привет,

Я недавно обновил свой vb.net настольное приложение winform от framework 4.0 до 4.6.1.
Я уже давно использую odbc32.dll для моего запроса, связанного с sql server.

Он больше не работает в 4.6.1.
Он потерпел неудачу в SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hDbc)
Ошибка : Система.AccessViolationException: 'попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.'

Это только ошибка в 64 битах, она прекрасно работает в 32 битах.

Пожалуйста, поделитесь со мной своей мудростью, большое вам спасибо

Что я уже пробовал:

#Region "DLL Imports"
    Private Declare Function SQLAllocEnv Lib "odbc32.dll" (ByRef phenv As Integer) As Integer
    Private Declare Function SQLAllocHandle Lib "odbc32.dll" (ByVal hType As Integer, ByVal hInput As Integer, ByRef phOutput As Integer) As Integer
    Private Declare Function SQLBrowseConnect Lib "odbc32.dll" (ByVal hDbc As Integer, ByVal szConnStrIn As String, ByVal cbConnStrIn As Integer, ByVal szConnStrOut As String, ByVal cbConnStrOutMax As Integer, ByRef pcbconnstrout As Integer) As Integer
    Private Declare Function SQLDisconnect Lib "odbc32.dll" (ByVal hDbc As Integer) As Integer
    Private Declare Function SQLFreeConnect Lib "odbc32.dll" (ByVal hDbc As Integer) As Integer
    Private Declare Function SQLFreeEnv Lib "odbc32.dll" (ByVal hEnv As Integer) As Integer
    Private Const SQL_HANDLE_DBC = 2
#End Region

  Public Function GetSQLServers() As String

        Dim retCode As Integer
        Dim hDbc As Integer
        Dim hEnv As Integer
        Dim strCon As String
        Dim strOutCon As String
        Dim intConLenOut As Integer

        strCon = "DRIVER={SQL Server};"
        strOutCon = Space(1000)

        retCode = SQLAllocEnv(hEnv)
        retCode = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hDbc)
        retCode = SQLBrowseConnect(hDbc, strCon, Len(strCon), strOutCon, Len(strOutCon) + 2, intConLenOut)

    End Function

1 Ответов

Рейтинг:
5

OriginalGriff

Вы не можете смешивать 32-и 64-битные компоненты в одном приложении.
Вам нужно будет либо найти 64-битную версию вашей библиотеки DLL, либо скомпилировать ваше приложение до 32 бит, чтобы использовать его.


ekograce

спасибо :)

OriginalGriff

Всегда пожалуйста!