Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: ODBC и VB: out of memory Добавлено: 19.05.03 16:19  

Автор вопроса:  Grigory

Добрый день, уважаемые!

Встретил проблему и совершенно не представляю, где смотреть...

Суть в следующем:

Хочу подключиться к Access 2000 через ODBC. API функции объявлены и, вроде, выглядят работоспособными. Однако при выполнении функций SQLAllocEnv и SQLAllocConnect возникает ошибка Cannot compile: Out of memory, а иногда и сам VB рушится с недопустимой операцией.

Вот описание моего кода.

Во первых, есть модуль с объявлением функций:

' Allocates environment handle

Declare Function SQLAllocEnv Lib "odbc32.dll" ( _

ByRef lngHEnv As Long _

) As Integer

' Allocates connection handle

Declare Function SQLAllocConnect Lib "odbc32.dll" ( _

ByVal lngHEnv As Long, _

ByRef lngHCon As Long _

) As Integer

Во-вторых, есть модуль класса, в котором производятся обращения к этим функциям.

В модуле объявлена переменная Private lngHEnv As Long.

Кроме того, созданы функции:

Private Function CreateEnvironment() As Integer

'**********************************************************************

'Purpose: Create work environment for ODBC

' and save its handle to variable

'Returns: error/success code as in enumStatus

'**********************************************************************

' Call API function to allocate the environment handle

CreateEnvironment = SQLAllocEnv(lngHEnv)

End Function

и

Public Function CreateConnection(ByVal strConnection As String, _

ByRef lngHCon As Long) As Integer

'**********************************************************************

'Purpose: Create the connection to the datasource

' and save its handle to variable

'Takes: 1) strConnection - the connection string

' 2) lngHCon - the connection handle is returned here

'Returns: the error code as in

' enumStatus

'**********************************************************************

' Create the environment

CreateConnection = CreateEnvironment

' Call API function to allocate the connection handle

CreateConnection = SQLAllocConnect(lngHEnv, lngHCon)

' Call API function to connect to the remote data source

CreateConnection = SQLDriverConnect(lngHCon, _

0, _

strConnection, _

500, _

strConnection, _

500, _

500, _

odbcNoPrompt)

End Function

В основной программе есть строки:

set gODBCWrap = New ODBCwrap <-- Это имя моего модуля класса

If Not gODBCWrap.CreateConnection _

("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & strPath, lngHCon) = 0 _

Then

MsgBox "Failed to connect to database.", vbExclamation, "Connection error"

End If

Где я сделал ошибку???

Буду очень благодарен за совет по решению проблемы.

Григорий.

PS Не знаете ли место в Интернете или хорошую книгу по использованию ODBC в VB?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 USA



Вопросов: 1
Ответов: 184
 Профиль | | #1 Добавлено: 20.05.03 05:09

SQLDriverConnect не объявлена

Ответить

Номер ответа: 2
Автор ответа:
 Grigory



Вопросов: 2
Ответов: 2
 Профиль | | #2 Добавлено: 20.05.03 09:22

Объявлена, я просто не написал здесь.

 

' Connects to SQL datasource
Declare Function SQLDriverConnect Lib "odbc32.dll" ( _
                                ByVal lngHCon As Long, _
                                ByVal lngHWnd As Long, _
                                ByVal strInConStr As String, _
                                ByVal intInConStrLen As Integer, _
                                ByVal strOutConStr As String, _
                                ByVal intOutConStrMaxLen As Integer, _
                                ByRef intOutConStrLen As Long, _
                                ByVal intDriverCompletion As Integer _
                          ) As Integer

Ответить

Номер ответа: 3
Автор ответа:
 Grigory



Вопросов: 2
Ответов: 2
 Профиль | | #3 Добавлено: 20.05.03 09:32

Прошу прощения за отсутствие форматирования в первом сообщении. Я его создал как текст, а не HTML

Вот более читабельная версия:

 

' Allocates environment handle
Declare Function SQLAllocEnv Lib "odbc32.dll" ( _
                                              ByRef lngHEnv As Long _
                                ) As Integer

' Allocates connection handle
Declare Function SQLAllocConnect Lib "odbc32.dll" ( _
                                                  ByVal lngHEnv As Long, _
                                                  ByRef lngHCon As Long _
                                    ) As Integer

 

 

Private Function CreateEnvironment() As Integer
  '**********************************************************************
  'Purpose: Create work environment for ODBC
  '         and save its handle to variable
 
  'Returns: error/success code as in enumStatus
  '**********************************************************************
    
  ' Call API function to allocate the environment handle
  CreateEnvironment = SQLAllocEnv(lngHEnv)
 
End Function

 

Public Function CreateConnection(ByVal strConnection As String, _
                                  ByRef lngHCon As Long) As Integer
 
  '**********************************************************************
  'Purpose: Create the connection to the datasource
  '         and save its handle to variable
  '         Plus initialize the statement collecton
 
  'Takes: 1) strConnection - the connection string
  '       2) lngHCon - the connection handle is returned here
 
  'Returns: the error code as in
  '         enumStatus
  '**********************************************************************
  ' Create the environment
  CreateConnection = CreateEnvironment
 
  ' Call API function to allocate the connection handle
  CreateConnection = SQLAllocConnect(lngHEnv, lngHCon)
  
  ' Call API function to connect to the remote data source
  CreateConnection = SQLDriverConnect(lngHCon, _
                                      0, _
                                      strConnection, _
                                      500, _
                                      strConnection, _
                                      500, _
                                      500, _
                                      odbcNoPrompt)


End Function

 

 

Public Sub StartDB(ByVal strPath As String)
  '******************************************************************************
  'Purpose:  Connect to a database
  '           using MS Access driver
 
  'Takes:  1) strPath - the path to the DB file
  '******************************************************************************
    
  Set gODBCWrap = New ODBCwrap
  
  If Not gODBCWrap.CreateConnection _
        ("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & strPath, lngHCon) = 0 _
  Then
 
    MsgBox "Failed to connect to database.", vbExclamation, "Connection error"
 
  End If
   
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 USA



Вопросов: 1
Ответов: 184
 Профиль | | #4 Добавлено: 21.05.03 06:20

Воспроизвел весь твой код и он заработал, по крайней мере сбойных мест нет, все отрабатывается, возвращаются ошибки, прога не рушится. Я добавил следующее:

  1. В модуле где StartDB объявление Private lngHCon As Long
  2. В модуле класса объявление Private lngHEnv As Long
  3. В модуле класса в функции CreateConnection в параметрах вызова SQLDriverConnect вместо odbcNoPrompt (это наверно из кого-то перечисления) подставил 0.

 

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам