2010-08-04 2 views
1

Я подключаюсь к Jet 4 DB через ODBC. Jet DB использует сквозные запросы к Oracle DB. Это работает до сих пор (не может напрямую обращаться к запросам p-t, но создание представления по запросу делает трюк).База данных Jet и сквозные запросы, параметры

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

Два вопроса:

1) Jet, похоже, в состоянии выдвинуть некоторые Where-положения в Oracle. Например, у меня есть транзитный запрос, который возвращает 100 тыс. Строк. Взгляд на p-t с одной фразой (например, «район = 1010») очень быстрый, поэтому обработка, похоже, происходит на Oracle. Добавление дополнительных предложений может замедлить запрос до обхода, зацикливаясь в течение нескольких минут с высокой загрузкой процессора. Есть ли какая-либо документация о том, что передается и что делается на стороне Jet?

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

Благодаря Martin

Edit: Извините за то, что неясно.

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

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

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

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

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

+0

Почему Jet необходимо, если вы запрашиваете Oracle? Почему бы не использовать ODBC и ADO http://www.connectionstrings.com/oracle? – Fionnuala

+0

Как всегда, бизнес-политика ... Я не могу создавать таблицы или загружать данные арбитража в хранилище данных Oracle. Я присоединяюсь к некоторым пользовательским данным, которые в настоящее время хранятся в Access/Jet с данными из Oracle db. – Martin

+0

Что переносит Jet в базу данных сервера, будет зависеть от используемой базы данных сервера и насколько хорошо написан драйвер ODBC. Jet запросит столько метаданных, сколько возможно, для оптимизации запроса и отправки как можно большего количества ресурсов серверу для обработки. Я бы посмотрел на вашу SQL-трассировку, чтобы узнать, что вызывает замедление с большим количеством критериев. Отмечу, что когда я смотрю на трассировки в SQL Server, простые запросы от Jet с критериями выполняются с помощью общего параметризованного sproc. Я бы ожидал чего-то подобного в Oracle. –

ответ

1

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

Вы, кажется, работаете в VBA. В VBA можно построить несколько интересных запросов в виде строк SQL и сохранить их в новых запросах, обновить существующие запросы, использовать их для источников записи для форм или открытых наборов записей. Вы можете использовать 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

Я не уверен, что понимаю, что вы здесь делаете. Означает ли это, что вы можете открывать произвольные подключения к другим базам данных, встроенным в запросы Jet SQL, включая строку Connection? Если это так, могу ли я также выполнить сквозные запросы? – Martin

+0

Да, вы можете. Ответ несколько блуждает, поскольку я не уверен, что вы хотите сделать, например, я ни в коем случае не уверен, что вы хотите совершить с сквозным запросом, или почему вам это нужно. – Fionnuala

+0

Если вы передадите строку соединения inline в режиме сквозной пересылки, она будет обработана удаленным сервером. Это может работать или не работать. –

0

Вы можете продублировать запрос PT в собственной БД вместо того, чтобы ссылаться на него в другой БД?

Все данные sql в запросе 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 
Смежные вопросы