因为许多客户/服务器应用程序非常依赖于存储过程 (SP),所以数据访问接口应该能够更快速有效地执行它们。不过,可以对存储过程进行技巧性处理。在某些情况下,存储过程需要 OUTPUT 管理,并返回状态值和其他一些更常规的参数。此外,一个 SP 可能返回多个复杂结果集,包括 PRINT 或 RAISERROR 语句返回值。某些情况下,创建复杂的 SP要好一些,而在另一些情况下,保持 SP 更简单、更模块化,并使用 Visual Basic 将它们连接在一起则更好,也更简便。
下面的代码显示了 RDO 对这些问题的解决方案。首先,它执行一个简单的、基于参数的 SP,并在网格中显示结果。对于后的 ADO 设计采取了一些适应性调节,并做了标注。它使用和前面示例中所建立的相同连接。
注意代码要求我们将一个正确的 ODBC "Call" 语句包括在其中。再次说明,这在 UserConnection 设计器中是不必要的,但在 RDO 基于代码的解决方案中却是非常重要的。在这里,您使用独立的 rdoQuery 对象,并将已打开的 Connection 分配给它。然后就可以在后续的调用中使用 rdoQuery 对象,以处理参数查询。
还要注意代码并不试图引用返回状态参数。直到结果集被完全充填,才能得到该值;只有在那时 SQL Server 才返回该值。
Private Sub RunSPButton_Click()
Dim Qy As New rdoQuery
Dim rs As rdoResultset
sql = "{? = Call AuthorByYearBorn (?,?)}"
Set Qy.ActiveConnection = cn
Qy.sql = sql
Qy.rdoParameters(0).Direction = rdParamReturnValue
Qy(1) = "1947"
Qy(2) = "1948"
Set rs = Qy.OpenResultset()
rdoGrid1.ShowData rs
ShowRows = rs.RowCount
rs.Close
End Sub
ADO在执行存储过程时有很多灵活性。但这种灵活性是以更多的代码为代价的。对于前面的示例(“执行参数查询”)来说,您可以建立自己的 ADODB Parameters 集合。在这种情况下,您执行一个简单的二参数 SP,即返回一个小结果集的“AuthorByYearBorn”。注意,尽管 ADO 允许您创建自己的参数,但这并不是必要的。
注意 ADO 集合是基于 0 的,这是为了和 DAO 相匹配。而 RDO 集合则是基于 1 的。
Private Sub RunSPButton_Click()
Dim Qy As New ADODB.Command
Dim Parm As New ADODB.Parameter
Dim Parm2 As New ADODB.Parameter
Set Qy.ActiveConnection = cn
Qy(0)="1947"
Qy(1)="1948"
Qy.CommandType = adCmdStoredProc
Qy.CommandText = "AuthorByYearBorn"
Set rs = Qy.Execute(ShowRows)
ADOGrid1.ShowData rs
End Sub