繁体   English   中英

如何使用MS Access表单动态重写passthrough查询?

[英]How to re-write a passthrough query on the fly using a MS Access form?

我编写了一个存储过程来复制,重写,然后附加新修改的数据。 此存储过程需要两个参数。 在访问中,我有一个工作的passthrough查询,执行我的SP,如下所示

execute [dbo].[CopyConData_StoS @Original = '1144', @Copy = '898'

ODBC Connect Str指向我的SP所在的开发数据库。

ODBC;DSN=DevDB;UID=jsmith;Trusted_Connection=Yes;DATABASE=TRDatabase

我想创建一个表单并重新编写SQL,这样我就可以在字段中输入我想要的任何参数,SP在执行我的SP时会使用它们。

我创建了一个表单并检查了表单的On Click Event Procedure,并提供了以下内容

Private Sub cmdRunPT_Click()

    Dim strSQL As String
    Dim qd As QueryDef
    Dim db As Database

    strSQL = "Execute...."      ' Modify as needed according to values in form's text boxes

    Set db = CurrentDb
    Set qd = db.QueryDefs("MyPassThruQuery")
    qd.SQL = strSQL
    qd.Execute dbFailOnError

    Set qd = Nothing
    Set db = Nothing

End Sub

我试图找出如何修改它来运行我的passthrough并能够手动输入两个参数。 我还需要传递我的连接字符串,以便知道使用我的dev db吗?

我基本上想在MSAccess中使用表单来允许我输入运行SP所需的两个参数。 在passthrough查询中,我给出了两个参数的硬编码示例。 我想要一个表格,我可以输入它们。 所以我需要动态地重新编写查询。

谢谢

当前代码 - 告诉我无法执行选择查询

Private Sub Command8_Click()

    Dim strSQL As String
    Dim qd As QueryDef
    Dim db As Database

    strSQL = "Execute [dbo].[CopyConData_StoS] " & _
    " @Original = '" & Me.Original & "', @Copy = '" & Me.Copy & "'"

    Set db = CurrentDb
    Set qd = db.QueryDefs("CopyConData_StoS")
    qd.SQL = strSQL
    qd.Execute dbFailOnError

    Set qd = Nothing
    Set db = Nothing

End Sub

你有什么看起来很好。

假设您在Access中创建并测试了pt查询,您可以这样说:

execute [dbo].[test4] 'a', 'b'

尝试运行查询 - 它应该工作得很好。

一旦(以及之后)你的查询工作,那么在代码中你所拥有的应该工作正常,或者甚至这将工作:

With CurrentDb.QueryDefs("CopyConData_StoS")
    .SQL = strSQL
   .Execute
 End With

注意上面的内容如何消除除了你的strSQL之外的声明任何变量的需要

但是,如果PT查询返回记录,那么您要将上面的内容更改为:

 Dim strSQL  As String
‘ code here to setup strSQL

Dim rst     As DAO.Recordset
With CurrentDb.QueryDefs("CopyConData_StoS")
   .SQL = strSQL
   .ReturnsRecords = True
   Set rst = .OpenRecordset
End With

因此,如果你“执行”一个动作查询,或者proc返回记录,那真的归结为。 如果它返回记录,那么你不能使用execute但是使用OpenRecordSet。

正如所指出的那样,如果已经创建并设置了PT查询,则不需要在代码中弄乱或设置连接字符串。 事实上,你最好将连接内容从代码中删除 - 如上所示,这样就可以通过保存在Access中的PT查询简单地使用t-sql。

还要检查2个参数是否为字符串(nvchar())或数字 - 如果其中一个参数是数字,那么您要删除单引号。 在编写任何VBA之前,最好使用Access中的工作PT查询进行测试。 (看来你检查过它们是字符串)

我可能会遗漏一些东西,但你的代码似乎已经完成了。

假设您的txtCopy上有文本框txtOriginaltxtCopy (并希望有验证规则将其值限制为正数),您需要:

strSQL = "Execute [dbo].[CopyConData_StoS] " & _
         " @Original = '" & Me.txtOriginal & "', @Copy = '" & Me.txtCopy & "'"

Debug.Print strSQL   ' goes into Direct Window (Ctrl+g) for debugging

其他一切都已经到位。

注意:您的参数看起来像数字(ID),不确定为什么要将它们作为字符串传递(使用单引号)。

除非MyPassThruQuery的连接字符串已更改,否则您无需重新分配它。
qd.SQL = strSQL就是你所需要的。

编辑

对于错误消息,有两件事:

  • Ditch dbFailOnError ,它仅对正常的Access动作查询有效。
  • 在设计视图中打开Pass-Through查询,打开属性表,确保Returns records为False。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM