从Access Server中的SQL Server存储过程获取结果集

时间:2011-06-05 23:36:10

标签: access-vba

我已经'幸运'足以继承需要极大清理的Access数据库。我们实际上将离开Access并将其转换为.NET / SQL Server。但是现在我们保留Access数据库的UI并将所有查询移动到SQL Server中。

不幸的是,我从来没有直接使用过Access,所以当我走的时候我就磕磕绊绊。

我正在寻找一种方法来编写一个函数,该函数接受存储过程和一些参数值,并在SQL Server上执行存储过程并将结果作为Resultset返回。

所以签名可能看起来像......

Public Function ExecuteStoredProcedure(storedProcName As String, parameterValues As String) As RecordSet

传入的参数值将以逗号分隔。

因此对此函数的示例调用可能看起来像......

Set returnValues = ExecuteStoredProcedure("SP_GetTableXYZContents","'01/01/2011','ABCD',2345")

这似乎是微不足道的,但我似乎无法让它正常运作。有人能指出我正确的方向吗?

我让它们仅通过以下方式执行(但无法获得返回值)

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "...connectionstring..."
conn.Execute storedProcCall, dbSQLPassThrough

请注意,在上面的代码中,函数只接受一个字符串变量(SP名称和参数值,其中SP名称和值以空格分隔,值以逗号分隔。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

有几种方法可以实现这一目标。这有两种可能性。

第一个是最简单的:

  ' String specifying SQL.
  SQL = "My_StorProc parm1, parm2, parm3"
  ...
  ' For a stored procedure that doesn't return records.
  MyDb.Execute SQL, dbSQLPassThrough
  i = MyDb.RowsAffected
  ...
  'For a stored procedure that returns records.
  set Rs = MyDB.OpenRecordset(SQL, dbOpenSnapshot, dbSQLPassThrough)

参考:How To Call Stored Procedures Using Data Access Objects

第二个使用ADODB对象:

   Dim Conn As ADODB.Connection
   Dim Cmd As ADODB.Command
   Dim Rs As ADODB.Recordset
   Dim Connect As String

   sConnect= "driver={sql server};" & _
             "server=server_name;" & _
             "Database=pubs;UID=uder_id;PWD=password;"

   ' Establish connection.
   Set Conn = New ADODB.Connection
   Conn.ConnectionString = sConnect
   Conn.Open

   ' Open recordset.
   Set Cmd = New ADODB.Command
   Cmd.ActiveConnection = Conn1
   Cmd.CommandText = "sp_AdoTest"
   Cmd.CommandType = adCmdStoredProc
   Cmd.Parameters.Refresh
   Cmd.Parameters(1).Value = 10
   Set Rs = Cmd1.Execute()

   ' Process results from recordset, then close it.
   Rs.Close
   Conn.Close
   Set Rs = Nothing
   Set Cmd = Nothing
   Set Conn = Nothing

参考:How To Invoke a Stored Procedure with ADO Query Using VBA/C++/Java

答案 1 :(得分:1)

您想要查看ADODB.Command对象。它的工作方式与.Net中的SqlCommand对象类似(即设置CommandText,设置CommandType,并使用我认为的CreateParameter方法添加参数。我使用它已经有一段时间了。

编辑: 忘记提及Command对象上的Execute方法也会返回Recordset