NOWAIT ?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

NOWAIT ?

Сообщение Matew » 25.05.2010 (Вт) 4:15

Использую драйвер Firebird_ODBC_1.2.0.69-Win32 к СУБД FireBird 2.1
Так подключаюсь к БД и заполняю Recordset:
Код: Выделить всё
Function DBConnect(DbPath As String, UserName As String, Pass As String) As Boolean
    On Error GoTo DB_Err
    DBConnect = False
    Set conData = New Connection
    Dim rst As ADODB.Recordset
    Set rst = New Recordset
    conData.CursorLocation = adUseServer
    conData.Open "DRIVER=Firebird/InterBase(r) driver; DBNAME=" & DbPath & "; UID=" & UserName & "; PWD=" & Pass & ";CLIENT=fbclient.dll;READONLY=1;NOWAIT=1;CHARSET=WIN1251;DIALECT=3;"
    Set rst = FillRecordset("select current_date as CurDate from rdb$database")

    If rst.RecordCount > 0 Then
        DBConnect = True
    Else
        DBConnect = False
    End If

    Set rst = Nothing
    Exit Function
DB_Err:
    MsgBox Err.Description
    DBConnect = False

End Function

Function FillRecordset(SQL As String) As ADODB.Recordset
    Dim rst As ADODB.Recordset
    Set rst = New Recordset
    rst.Open SQL, conData, adOpenStatic, adLockOptimistic
    Set FillRecordset = rst
End Function

Проблема в том, что если запрос содержит "залоченную" запись rst.Open ждет завершения блокирующей транзакции, а я хочу, что бы выпадала ошибка. В какую сторону копать? Вроде перепробовал все параметры подключения...
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: NOWAIT ?

Сообщение HandKot » 31.05.2010 (Пн) 12:15

не проверял, но
подставить параметр Options в метод Open рекордсета и открывать оный либо в асинхронном режиме adAsyncExecute, либо без юлокировок adAsyncFetchNonBlocking (посмотрите что учше подходит)

Код: Выделить всё
rst.Open SQL, conData, adOpenStatic, adLockOptimistic, adAsyncFetchNonBlocking


либо использовать объект ADODB.Command, который выполнит запрос в асинхронном режиме
и по прошествии определенного времени проверить статус выполнения и если запрос не выполнился, выдать ошибку


примерно так

Код: Выделить всё
Function FillRecordset(SQL As String) As ADODB.Recordset
    Dim rst As ADODB.Recordset
    Dim cmd As ADODB.Command

    set rst = cmd.Execute( SQL, adLockOptimistic,  adAsyncExecute)
    'здесь делаем задержку, если надо
    'и проверяем после неё статус объекта
    If cmd.State = adStateExecuting Then
        'генерим ошибку
    End If

   
    Set FillRecordset = rst
End Function
I Have Nine Lives You Have One Only
THINK!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 111

    TopList