1

我有一个存储过程在 SQL 中有 4 个参数,并且想要构建一个应用程序来访问 exec 这个 SP。

我有一个访问表单,它有四个文本框,只需键入传递参数和一个按钮即可单击,其中包含如下代码

  Private Sub Command13_Click()

  Dim dbs As DAO.Database
  Dim qdf As DAO.QueryDef
  Dim strSQL As String
  Const c_strSQL As String = "EXEC sp_xCopy @CurCo={P1}, @CurNumber={P2}, @NewCo={P3},   @NewNumver={P4}"

 Set dbs = CurrentDb     Set qdf = dbs.QueryDefs("QueryCopyVendor") 
 strSQL = Replace(c_strSQL, "{P1}", "Forms!CopyVendor!CurCo") 
 strSQL = Replace(strSQL, "{P2}", "Forms!CopyVendor!CurNumber") 
 strSQL = Replace(strSQL, "{P3}", "Forms!CopyVendor!NewCo")
 strSQL = Replace(strSQL, "{P4}", "Forms!CopyVendor!NewNumber")
 qdf.SQL = strSQL
 qdf.Execute
 Set qdf = Nothing
 Set dbs = Nothing

 End Sub

但是当我提交时,我得到了同伴错误:

run_time 错误“3065”无法执行选择查询

这是否意味着我的 SP 中不能有选择查询?请帮忙。

4

1 回答 1

3

这是否意味着我的 SP 中不能有选择查询?

不,错误消息告诉您 Access 认为您的查询是 SELECT 查询(或某种返回记录的查询)并且您正在尝试.Execute它。Access 不喜欢这样,因为它认为您应该将返回的记录分配给Recordset.

要在 DAO 中创建传递查询 (PTQ),您必须

  • 将 QueryDef 的.Connect属性设置为至少ODBC;, 和
  • 如果不返回行集,则将该.ReturnsRecords属性设置为False

以下是创建 PTQ 的基本代码:

Sub CreatePTQ()
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("ptq")
qdf.Connect = "ODBC;"
qdf.ReturnsRecords = False
qdf.SQL = "EXEC foo"
qdf.Close
Set qdf = Nothing
Set cdb = Nothing
End Sub

此外,在您的代码中,您将用表单控件的名称替换占位符,例如...

strSQL = Replace(c_strSQL, "{P1}", "Forms!CopyVendor!CurCo")

...当您应该用控件的替换这些占位符时...

strSQL = Replace(c_strSQL, "{P1}", Forms!CopyVendor!CurCo)

EXEC...请记住,如果任何参数是字符串,那么您需要在语句中为它们加上引号。

于 2013-04-25T16:00:01.740 回答