Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Jet数据库和传递查询、参数_Oracle_Ms Access_Vba_Odbc_Jet - Fatal编程技术网

Oracle Jet数据库和传递查询、参数

Oracle Jet数据库和传递查询、参数,oracle,ms-access,vba,odbc,jet,Oracle,Ms Access,Vba,Odbc,Jet,我正在通过ODBC连接到Jet 4 DB。 jetdb使用对Oracle数据库的传递查询。到目前为止,这是可行的(不能直接访问p-t查询,但在查询上创建视图就可以了) 我需要一些由p-ts返回的数据子集。参数最好,但不受支持 两个问题: 1) Jet似乎确实能够将一些where子句推送到Oracle。我有一个passthrough查询,返回100k行。使用一个flirting子句(例如“district='1010')查看p-t非常快,因此处理似乎发生在Oracle上。添加更多子句可以将查询速度

我正在通过ODBC连接到Jet 4 DB。 jetdb使用对Oracle数据库的传递查询。到目前为止,这是可行的(不能直接访问p-t查询,但在查询上创建视图就可以了)

我需要一些由p-ts返回的数据子集。参数最好,但不受支持

两个问题:

1) Jet似乎确实能够将一些where子句推送到Oracle。我有一个passthrough查询,返回100k行。使用一个flirting子句(例如“district='1010')查看p-t非常快,因此处理似乎发生在Oracle上。添加更多子句可以将查询速度降低到爬网速度,在CPU利用率较高的情况下循环数分钟。是否有关于在喷气机端传递什么和执行什么的文档

2) 有很多教程介绍如何使用VBA/Access创建动态直通查询。通过ODBC访问Jet是否可以实现这一点(或任何类似的功能)

谢谢 马丁

编辑: 对不起,我不太清楚

我有一个通过ODBC访问Jet db的报告工具。jetdb包含一些数据和一些到Oracle数据库的直通查询。典型的用例是使用Jet和Oracle的数据为给定的部门和给定的日期生成报告。这在原则上非常有效

问题是直通查询不能包含任何参数。passthrough查询的工作方式类似于视图,因此我可以简单地执行“select*from pt_query,其中dep='A'和date=somedate”。但是,Jet从pt加载所有行,并在客户端执行完全扫描。对于一个100k行的视图来说,这是非常慢的,我需要找到一种方法来避免这种情况

对于一些简单的选择,Jet似乎让Oracle完成了繁重的工作,并且没有加载所有行,因此我的问题1

如果这不起作用,我需要找到一种方法,强制Jet只从Oracle加载给定请求所需的数据


我知道我可以通过Access VBA修改pts,但我只能通过ODBC连接,因此我只能将SQL传递给Jet,而不能调用vb api(除非可以在SQL语句中内联vb)

构造查询以导致表扫描并非不可能,这就是问题的根源

你好像在VBA工作。可以在VBA中将许多有趣的查询构造为SQL字符串,并将它们保存到新查询、更新现有查询、将它们用于表单的记录源或打开记录集。您可以使用DAO或ADO,这取决于您想做什么。我有Oracle,所以我所能做的就是使用SQL Server提出建议,方括号中的连接可以通过查看链接表的连接(CurrentDb.TableDefs(“NameOfTable”).Connect)获得:


构造查询以导致表扫描并非不可能,这就是问题的根源

你好像在VBA工作。可以在VBA中将许多有趣的查询构造为SQL字符串,并将它们保存到新查询、更新现有查询、将它们用于表单的记录源或打开记录集。您可以使用DAO或ADO,这取决于您想做什么。我有Oracle,所以我所能做的就是使用SQL Server提出建议,方括号中的连接可以通过查看链接表的连接(CurrentDb.TableDefs(“NameOfTable”).Connect)获得:


您是否可以在自己的数据库中复制PT查询,而不是在另一个数据库中链接到它

PT查询中的所有sql都应该在链接服务器上执行,而无需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];
从DHSVIEWS.ClaimHeaderV中选择*,其中
DHSViews.claimheaderV.ClaimType='p'和
DHSViews.claimheaderV.finalVersonId='y'和
DHSViews.claimheaderV.replumentAmount>0和
DHSViews.claimheaderV.majorProgramram='HH'和
DHSViews.claimheaderV.ServiceDateFrom>=[qStart]和
DHSViews.claimheaderV.ServiceDateFrom 0
iPosEnd=InStr(iPosStart,sqlNew,“]”)
param=Mid(sqlNew、iPosStart+1、IPOSSend-iPosStart-1)
选择Case参数
案例“qStart”
paramVal=“”&rsQuarter(“quarterStart”)&rsquarterStart“
案件“qEnd”
paramVal=“”&rsquartend(“quartend”)和“”
结束选择
sqlNew=Mid(sqlNew,1,iPosStart-1)和paramVal&Mid(sqlNew,iPosEnd+1)
iPosStart=InStr(iPosEnd,sqlNew,“[”)
环
如果是sqlNew sqlOld,那么
qdef.sql=sqlNew
如果结束
db.querydfs(rsPTAppend(“append”)).Execute
如果是sqlNew sqlOld,那么
qdef.sql=sqlOld
如果结束

您能否在自己的数据库中复制PT查询,而不是在另一个数据库中链接到它

PT查询中的所有sql都应该在链接服务器上执行,而Jet不会试图解析或执行它。从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];
从DHSVIEWS.ClaimHeaderV中选择*,其中
DHSViews.claimheaderV.ClaimType='p'和
DHSViews.claimheaderV.finalVersonId='y'和
DHSViews.claimheaderV.replumentAmount>0和
DHSViews.claimheaderV.majorProgramram='HH'和
DHSViews.claimheaderV.ServiceDateFrom>=[qStart]和
DHSViews.claimheaderV.ServiceDateFrom 0
iPosEnd=InStr(iPosStart,sqlNew,“]”)
param=Mid(sqlNew、iPosStart+1、IPOSSend-iPosStart-1)
选择Case参数
案例“qStart”
paramVal=“”&rsQuarter(“quarterStart”)&rsquarterStart“
案件“qEnd”
paramVal=“”&rsquartend(“quartend”)和“”
结束选择
sqlNew=Mid(sqlNew,1,iPosStart-1)和paramVal&Mid(sqlNew,iPosEnd+1)
iPosStart=InStr(iPosEnd,sqlNew,“[”)
环
如果是sqlNew sqlOld,那么
qdef.sql=sqlNew
如果结束
db.querydfs(rsPTAppend(“append”)).Execute
如果是sqlNew sqlOld,那么
qdef.sql=sqlOld
如果结束

如果您需要,为什么需要Jet
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];
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