DAO .Execute метод не удается в Access mde - PullRequest
2 голосов
/ 19 февраля 2010

Во-первых, я использую Access 2000 и DAO.У меня есть код, который выполняет простой запрос INSERT INTO, который я вызываю с помощью db.Execute.Этот код отлично работает внутри MDB.Однако, если я скомпилирую в mde, я получу

ошибка 5 - Недопустимый вызов процедуры или аргумент

в этой строке, и запись не будет вставлена.Однако, если я перехожу с db.Execute на DoCmd.RunSQL, используя точно такой же оператор SQL, запись вставляется без проблем.Кто-нибудь знает, почему метод выполнения DAO объекта базы данных DAO внезапно перестал работать после компиляции в MDE?

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

РЕДАКТИРОВАТЬ:
Эта строка не выполняется в MDE (, но отлично работает в MDB ):

App.db.Execute InsertSQL, dbFailOnError

Из непосредственного окна с точкой останова в приведенной выше строке кода:

?InsertSQL
INSERT INTO Changes
(PropertyID, FieldID, [Which], [When], [Before], Reason, ReportChange)
VALUES (1, 2, "M", #2/19/2010 4:51:44 PM#, "Suite 2; 430 W KING ST; ABBOTTSTOWN, PA 17301-9771", "Per Owner", True)

(у меня есть целый модуль класса, предназначенный для построения и выполнения операторов SQL, поэтомуне совсем практично показать, как именно я построил строковую переменную InsertSQL. Однако я действительно не думаю, что это уместно.)

Эта строка работает везде:

DoCmd.RunSQL InsertSQL

РЕДАКТИРОВАТЬ: приложениеОпределение .db (обратите внимание, что в моем проекте нет ссылки на ADO, только DAO):

Public App As New clsApp

модуль класса clsApp (только соответствующие строки):

Private m_objDB As Database

Public Property Get db() As Database
    Set db = m_objDB
End Property

Private Sub Class_Initialize()
    Set m_objDB = CurrentDb
End Sub

Private Sub Class_Terminate()
    Set m_objDB = Nothing
End Sub

Если выЛюбопытно, что я использую App.db, а не CurrentDB по двум основным причинам: 1) небольшой выигрыш в производительности, так как не нужно многократно вызывать функцию CurrentDB (вызывать ее один раз, а затем просто ссылаться на возвращаемый объект) и 2) свойства объекта базы данныхкак .RecordsActed всегда возвращает соответствующую информацию.Плюс, это быстрее, чтобы печатать.И я программист, поэтому я по своей сути ленив.

РЕДАКТИРОВАТЬ: Позвольте мне сначала извиниться перед теми, кто следил за этой темой и пытается помочь мне.Похоже, я не учел критических деталей моей проблемы.Вызов App.db.Execute происходит внутри модуля класса (clsSQL) и ссылается на глобальную переменную с именем App, которая сама является экземпляром другого модуля класса (clsApp).Я предполагаю, что проблема в том, что я имею в виду экземпляр модуля класса из другого модуля класса.Кто-нибудь может подтвердить, что вызов одного модуля класса из другого является чем-то, что поддерживается MDB, а не MDE?[ Это не проблема.Я слишком обдумывал это.Смотрите мой ответ для полной истории. ]

Ответы [ 3 ]

0 голосов
/ 20 февраля 2010

Какая версия DAO у вас есть в ваших ссылках?Возможно, старая версия работает нормально на mdb, но не работает на mde.Попробуйте установить его на последнюю версию и скомпилируйте снова

0 голосов
/ 17 мая 2011

Во-первых, мои искренние извинения тем, кто пытался мне помочь с этим. Поскольку я расстраиваюсь, когда другие задают вопросы, я пропускаю ключевую информацию, потому что не считаю ее актуальной. Здесь была полная процедура инициализации для моего модуля класса clsApp:

Private Sub Class_Initialize()
    Application.Echo True
    m_bEcho = True

    Set m_objDB = CurrentDb
    m_sUser = GetUserName
    Set m_objStatus = New clsStatus
    m_sPgmName = Application.CurrentProject.Name
    m_sPgmName = Left(m_sPgmName, InStr(m_sPgmName, ".mdb") - 1)
End Sub

Ключевая строка - последняя. Когда я скомпилировал в «.mde», строка «.mdb» больше не присутствовала в CurrentProject.Name. В результате при вызове InStr() вернулось 0. И 0 - 1 = -1. Поэтому я передавал отрицательное число в качестве параметра длины для функции Left(). Однако параметр длины не может быть отрицательным. Наиболее определенно это «Недопустимый вызов процедуры или аргумент».

Мое простое исправление состояло в том, чтобы удалить «mdb» из «.mdb» и просто проверить местоположение «.» Это также правильно работает с расширениями ".accdb" и ".accde" 2007.

Опять мои извинения.

0 голосов
/ 20 февраля 2010

Скорее всего, вы используете ссылку управления формами внутри строки, передаваемой в оператор Execute. Это я! ControlName находится внутри кавычек. Измените это так, чтобы оно было вне кавычек. То есть изменить ".... ВЫБЕРИ меня! ControlName As Field1, Field2, Field3 ..." на ".... SELECT" & me! ControlName & "As Field1, Field2, Field3 ..."

Таким образом, VBA может правильно преобразовать значение имени элемента управления. Docmd.RunSQL сделает это за вас. Выполнить не может.

...