VB6 vs DAO360.dll

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
CoolTeapot
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 123
Зарегистрирован: 28.06.2002 (Пт) 8:56
Откуда: Russia, Zelenogorsk

VB6 vs DAO360.dll

Сообщение CoolTeapot » 17.11.2004 (Ср) 9:47

Появилась такая проблема при работе с базой Access:
В режиме отладки(в редакторе VB6) прога работает нормально, но стоит только скомпилировать exe и запустить его, то программа начинает чудить. Т.е. при выполнении кода (см. ниже) программа просто вылетает без сообщений под Win XP или в Win ME выдает сообщение о том, что программа вызвала ошибку DAO360.dll и будет закрыта, т.е. мой обработчик ошибок даже не срабатывает.
Путем вставки MSGBOXов через каждую строку выяснил что вылетает прога при попытке присвоить значение параметру запроса.

Код: Выделить всё
    On Error GoTo ОбработкаОшибок
   
    Dim qdf_tmp As QueryDef
    Set qdf_tmp = db.QueryDefs("Del_Record")
    qdf_tmp("Code_") = CurCodeSost '<-здесь вылетает
    qdf_tmp.Execute
    DoEvents
    qdf_tmp.Close
    Set qdf_tmp = Nothing
-
-
-
-
    Exit Sub

ОбработкаОшибок:

    If Err.Number <> 0 Then

        MsgBox Err.Description & vbCrLf & "ClearRecord_1", vbCritical + vbOKOnly
        Err.Clear
        Resume Next

    End If


Что могут посоветовать умные люди для решения этой проблемы? Какие нибудь мысли есть?
:cry:
Жизнь - борьба.
До обеда с голодом, после обеда со сном.

CoolTeapot
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 123
Зарегистрирован: 28.06.2002 (Пт) 8:56
Откуда: Russia, Zelenogorsk

Сообщение CoolTeapot » 17.11.2004 (Ср) 14:42

:!: Интересное продожение:

СКопировал точно такой-же код из другого модуля (старый закоментировал)

Код: Выделить всё
Dim qdf_tmp As QueryDef
Set qdf_tmp = db.QueryDefs("Del_Record")
qdf_tmp("Code_") = CurCodeSost
qdf_tmp.Execute
DoEvents
qdf_tmp.Close
Set qdf_tmp = Nothing


В этом месте программа стала работоспособной!!!
НО в нескольких других функциях, проблема вылетания при передачи значения параметру запроса появилась, а ведь раньше небыло. Такая же замена теста уже не помогает.

Пробовал компилировать на разных машинах - без изменений.

Появляются мысли о полтергейсте и кознях Microsoft. :x

Неужели ни у кого небыло таких глюков?

А время жмёт.....
Жизнь - борьба.
До обеда с голодом, после обеда со сном.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 23.11.2004 (Вт) 11:45

Для чего тебе это вообще надо?
Если просто для выполнения запроса, то пиши:
db.Execute CurCodeSost
Если ты хочешь сохранить запрос в access'е то пиши:
db.QueryDefs("Del_Record").SQL=CurCodeSost
все просто. :) просто это прихдит с опытом

CoolTeapot
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 123
Зарегистрирован: 28.06.2002 (Пт) 8:56
Откуда: Russia, Zelenogorsk

Сообщение CoolTeapot » 23.11.2004 (Вт) 14:24

snov писал(а):Для чего тебе это вообще надо?
Если просто для выполнения запроса, то пиши:
db.Execute CurCodeSost
Если ты хочешь сохранить запрос в access'е то пиши:
db.QueryDefs("Del_Record").SQL=CurCodeSost
все просто. :) просто это прихдит с опытом


Это не совсем то.
Надо выполнять запросы, сохранённые в Access и имеющие несколько десятков параметров (условия, значения и т.п.).

Правильнее было написать даже так
Код: Выделить всё
qdf_tmp.Parameters("Code_") = CurCodeSost

но это всё равно не катит.

Получилось обойти эту ошибку, создав функцию, перебирающую все параметры запроса и присвающую значение нужному параметру.

Код: Выделить всё
Private Function SetParameters(CurQDF As QueryDef, CurQDFParName As String, CurQDFParValue As Variant) As Long

    SetParameters = 0

    Dim i As Integer

    For i = 0 To CurQDF.Parameters.Count - 1

        If CurQDF.Parameters(i).Name = CurQDFParName Then

            CurQDF.Parameters(i).Value = CurQDFParValue
            SetParameters = 1
            Exit For

        End If
   
    Next i

End Function


остался один вопрос почему эта ошибка появляется только в одном модуле, а в остальных все работает без сбоев.
:?:
Жизнь - борьба.
До обеда с голодом, после обеда со сном.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 23.11.2004 (Вт) 14:38

Для чего тебе это мож есть более простой способ реализации поставленной задачи?


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList