[英]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
上有文本框txtOriginal
和txtCopy
(并希望有验证规则将其值限制为正数),您需要:
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
就是你所需要的。
编辑
对于错误消息,有两件事:
dbFailOnError
,它仅对正常的Access动作查询有效。 Returns records
为False。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.