База данных Jet и сквозные запросы, параметры - PullRequest
1 голос
/ 04 августа 2010

Я подключаюсь к Jet 4 DB через ODBC.Jet DB использует сквозные запросы к базе данных Oracle.Пока это работает (не может получить прямой доступ к pt-запросам, но создание представления по запросу делает свое дело).

Мне нужно некоторое подмножество данных, возвращаемых p-ts.Параметры будут лучшими, но они не поддерживаются.

Два вопроса:

1) Кажется, что Jet действительно может выдвигать некоторые предложения where в Oracle.Например, у меня есть сквозной запрос, который возвращает 100 тыс. Строк.Вид на pt с одним выражением мерцания (например, "district = '1010'") очень быстрый, поэтому обработка, похоже, происходит в Oracle.Добавление дополнительных предложений может замедлить выполнение запроса до обхода, зацикливаясь на минуты с высокой загрузкой ЦП.Есть ли какая-либо документация о том, что передается и что делается на стороне Jet?

2) Существует множество руководств по созданию динамических сквозных запросов с помощью VBA / Access.Возможно ли сделать это (или что-нибудь в этом роде) с помощью Jet, доступного через ODBC?

Благодарю Мартина

Редактировать: Извините, что так неясно.

У меня есть инструмент отчетности, который обращается к базе данных Jet через ODBC.База данных Jet содержит некоторые данные и несколько сквозных запросов к базе данных Oracle.Типичным вариантом использования может быть создание отчета для данного отдела и определенной даты с использованием данных из Jet и Oracle.В принципе это работает очень хорошо.

Проблема в том, что сквозные запросы не могут содержать никаких параметров.Сквозной запрос работает как представление, поэтому я могу просто выполнить «select * from pt_query, где dep = 'a' и date = somedate".Jet, однако, загружает все строки из pt и выполняет полное сканирование на стороне клиента.Это невероятно медленно для просмотра 100-строк, и мне нужно найти способ избежать этого.

Для некоторых простых выборок Jet, похоже, позволяет Oracle выполнять тяжелую работу и не загружает все строки, поэтому мой вопрос 1.

Если это не такработать, мне нужно найти способ заставить Jet загружать только те данные, которые мне нужны от Oracle для данного запроса.

Я знаю, что могу изменять pts через Access VBA, но я подключаюсь только через ODBC, поэтому я могу только передавать SQL в Jet, а не вызывать vb api (если только это не возможно для встроенного VB в операторе SQL),

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Не исключено, что запрос создан для сканирования таблицы, и это вызывает проблему.

Похоже, вы работаете в VBA.Можно построить довольно много интересных запросов в виде строк SQL в VBA и сохранить их в новых запросах, обновить существующие запросы, использовать их для источников записей для форм или открытых наборов записей.Вы можете использовать DAO или ADO, в зависимости от того, что вы хотите сделать.У меня есть Oracle, поэтому все, что я могу сделать, это предложить идеи с использованием SQL Server. Соединение в квадратных скобках можно получить, посмотрев на соединение связанной таблицы (CurrentDb.TableDefs ("NameOfTable"). Connect):

Dim cn As New ADODB.Connection

''You can use Microsoft.ACE.OLEDB.12.0 or Microsoft.Jet.OLEDB.4.0
scn = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" _
    & CurrentProject.FullName
cn.Open scn

''An insert query, but you can see that is would be easy enough to 
''select from two different databases
s = "INSERT into [ODBC;Description=TEST;DRIVER=SQL Server;" _
& "SERVER=ServerName\SQLEXPRESS;Trusted_Connection=Yes;" _
& "DATABASE=test].Table2 (id, atext) select id, atext from table1"

cn.Execute s

Или

''http://www.carlprothman.net/Default.aspx?tabid=87
strConnect = _
    "Provider=sqloledb;" & _
    "Data Source=myServerName;" & _
    "Initial Catalog=Test;" & _
    "Integrated Security=SSPI"
With cmd
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = "SELECT ID, aText FROM table2 " _
                 & "WHERE ID=?"
    .Parameters.Append .CreateParameter _
        ("ID", adInteger, adParamInput, , 1)
    .CommandTimeout = 0
    Set rs = .Execute
End With
0 голосов
/ 04 августа 2010

Можете ли вы продублировать запрос PT в своем собственном БД вместо ссылки на него в другом БД?

Все sql в запросе PT должны выполняться на связанном сервере без попытки Jet проанализировать или выполнить его. Это на иностранном языке с точки зрения Джета.

Я буду использовать такой код в PT:

SELECT * FROM DHSVIEWS.ClaimHeaderV    WHERE
DHSViews.claimheaderV.ClaimType = 'p'    AND
DHSViews.claimheaderV.FinalVersionInd = 'y'    AND
DHSViews.claimheaderV.ReimbursementAmount > 0    AND
DHSViews.claimheaderV.majorProgram = 'HH'    AND
DHSViews.claimheaderV.ServiceDateFrom >= [qStart]    AND
DHSViews.claimheaderV.ServiceDateFrom <=  [qEnd];

и это в VBA:

Set qdef = db.QueryDefs(qryPT)
sqlOld = qdef.sql
iPosStart = InStr(sqlOld, "[")
sqlNew = sqlOld
Do While iPosStart > 0
    iPosEnd = InStr(iPosStart, sqlNew, "]")
    param = Mid(sqlNew, iPosStart + 1, iPosEnd - iPosStart - 1)
    Select Case param
        Case "qStart"
            paramVal = "'" & rsQuarter("quarterStart") & "'"
        Case "qEnd"
            paramVal = "'" & rsQuarter("quarterEnd") & "'"
    End Select
    sqlNew = Mid(sqlNew, 1, iPosStart - 1) & paramVal & Mid(sqlNew, iPosEnd + 1)
    iPosStart = InStr(iPosEnd, sqlNew, "[")
Loop
If sqlNew <> sqlOld Then
    qdef.sql = sqlNew
End If
db.QueryDefs(rsPTAppend("append")).Execute
If sqlNew <> sqlOld Then
    qdef.sql = sqlOld
End If
...