Во-первых, я использую 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?[ Это не проблема.Я слишком обдумывал это.Смотрите мой ответ для полной истории. ]