我是在一个虚拟机上操作的,我的SQL服务器和machine位于虚拟机上。我建立了从Access到SQL的ODBC连接,并链接了几个表。我可以对这些表执行通常的操作(选择/更新等)。
但是,由于一些奇怪的原因,我无法运行存储过程!这个过程在SSMS上运行得很好,但当我从Access VBA调用它时却不是这样。下面是我用来执行proc的代码(我还需要传递3个参数,但为了简单起见,我已经从下面的代码中排除了这一点):
With CurrentDb.QueryDefs("qPass")
.SQL = "exec [HS].[spGetXMLExtract]"
.Execute
End With
MS返回的错误是
无效SQL语句:预期“删除”、“插入”、“过程”、“选择”或“更新”。
不知道这是否发生了,因为: 1.我已经在VM上得到了这些应用程序;和/或2。我需要将存储过程链接到MS访问,就像我对表所做的那样(也许这是不可能的)。
我想有些复杂的方法我可能会采用,但我不想这么做。示例:
1.使用存储参数的列在中创建一个表;在该表上编写一个AFTER UPDATE
触发器,该触发器执行我的存储过程;从MS启动一个“更新”查询,该查询将更新该表中的参数,然后触发一个AFTER UPDATE
触发器。或;
2.完全消除了方程中的存储过程,并执行它的单个语句(选择/更新/插入等)在MS Access中通过Sub。不过,不知道这是否会导致创建临时表的问题。
有人能给我个建议吗,这是一个真正的阻滞剂!
提前感谢!
发布于 2016-11-10 16:59:15
如果QueryDef没有有效的"ODBC;..."
连接字符串作为其.Connect
属性,您将收到该错误消息。这就是Access将QueryDef标识为传递查询的方式。
如果已经定义了ODBC链接表,则可以将其.Connect
属性值用于QueryDef的.Connect
属性,如下所示:
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_table1").Connect ' grab .Connect string from linked table
qdf.sql = "exec [HS].[spGetXMLExtract]"
qdf.ReturnsRecords = False
qdf.Execute
..。或者,如果存储过程实际上返回了一个结果集:
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_table1").Connect ' grab .Connect string from linked table
qdf.sql = "exec [HS].[spGetXMLExtract]"
qdf.ReturnsRecords = True
Dim rst As DAO.Recordset
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
Do Until rst.EOF
' do stuff
rst.MoveNext
Loop
rst.Close
发布于 2016-11-10 15:36:12
我现在没有访问MS-Access的权限,但在我看来,好的语法是:
`strSQL = "exec [HS].[spGetXMLExtract]"
With CurrentDb.QueryDefs(strSQL)
'Fill parameters
.Parameters(0) = My first param
.Parameters(1) = My 2nd param
.Parameters(2) = My last param
'Execute the query
.Execute
End With `
我希望这会有帮助!
https://stackoverflow.com/questions/40530836
复制相似问题