Как использовать публичную функцию MS Access из VB6

У меня есть база данных MS Access с общедоступной функцией, определенной в VBA, которая хранится в Module1. Я хотел бы включить эту функцию как часть запроса, который передается в ADODB из VB6 с помощью метода Open ADODB.RecordSet.

Функция VBA называется IsOpcodePresent и принимает два параметра, указанные в запросе.

Запрос (сокращенно)

SELECT * FROM tbl WHERE IsOpcodePresent(example,syl) order by syl;

Можно ли это сделать? Если я использую стандартные функции доступа, такие как IsNull, то это работает. Но с моей собственной функцией это не так.


person bugmagnet    schedule 22.10.2012    source источник
comment
что возвращает IsOpcodePresent?   -  person John Woo    schedule 22.10.2012
comment
Вы не можете использовать UDF (функции) вне экземпляра Access.   -  person Fionnuala    schedule 22.10.2012


Ответы (2)


Боюсь, это невозможно. Вам понадобится экземпляр MS Access.

«База данных» MS Access состоит из двух частей. Формы, отчеты и код хранятся в MS Access, а данные обычно хранятся в базе данных Jet/ACE. Ваш запрос ADODB относится к базе данных Jet/ACE, которая не имеет подключения к «внешнему интерфейсу». Когда вы запускаете запрос в MS Access, он имеет ссылку на код.

В зависимости от функции может быть возможно переписать как Макрос данных, если вы используете Access 2010 или более позднюю версию. Они будут работать даже вне MS Access, поскольку привязаны к базе данных ACE.

person Fionnuala    schedule 22.10.2012
comment
Итак, если я создам экземпляр Access.Application, что тогда? - person bugmagnet; 23.10.2012
comment
Я наверное не правильно объяснил. Запрос, использующий определяемую пользователем функцию или функцию доступа, не будет выполняться вне MS Access. Если вы создадите экземпляр Access, вы можете выполнить запрос в Access, а не то, что, я думаю, вы хотите. - person Fionnuala; 23.10.2012

Function GetAccessRecordset(sDatabase As String, sSQL As String) As Variant
    Dim oAccess As Object
    Set oAccess = CreateObject("Access.Application")
    oAccess.OpenCurrentDatabase (sDatabase)
    oAccess.Visible = False
    Dim dbs As Object
    Set dbs = oAccess.CurrentDb.OpenRecordSet(sSQL)
    GetAccessRecordset = dbs.GetRows(dbs.RecordCount)
    dbs.Close
    oAccess.Quit
End Function

Это то, что я хотел. Он отлично работает, если у вас нет блокировки скрипта или если скрипт подписан, и база данных принимает подпись. Он дает мне двумерный массив результатов и позволяет использовать функции на основе сценариев.

person bugmagnet    schedule 26.10.2012