前两天,自己在access中实现一个功能时,想利用sql server中的存储过程实现,于是想到到网上找资料,看有没有能实现VBA编程实现输出sql server存储过程的返回值的例子。没有还真有(没有做不到的,只有想不到的)。我看过之后,就试着做起来,测试了,问题就出来了,总是提示:运行时错误...多步 OLE DB ...,从来没遇到过的错误提示,就又上网搜索了一下,结果列表随即显示,果然这么多此类问题,真希望从中找到答案和解决办法,谁知我打开了一个又一个网址,分析测试了我的程序一遍又一遍,还是没有头绪。最后,我想到到论坛发帖子,谁知,结果是没人回帖。
我总有这样的感觉,有些问题需要花一定的时间来解决,也许过个几天,你就找到答案了,前提是:别气馁,多想想,多测试。这不,我有花了两天的时间,今天上午的不懈努力,终于解决了我的问题。可是,我还没明白是为什么。
今天,第一次发表“文章”,来分享下我的感受和我的问题。
下面就是我在网上找的例子,直接贴在我的程序中提示错误(刚开始,我以为是我自己的程序有问题,后来我就试试找的例子,没想到也是错误的),所以我就猜测各种原因,最终被我找到了。
首先在sql server中创建存储过程(正确的)
CREATE PROCEDURE sp_2
@p int output,
@p1 int,
@p2 int
as
set @p = @p1+@p2
return 99
在access中的一个窗体按钮上测试
Private Sub Command1_Click()
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = CurrentProject.Connection(其实根本原因就是这个连接的问题,不知道是不是在access中不适合用,我就用了,最后想到是这个地方有错)
'@return_value"这个参数在输入参数的最前面,名称是固定的
cmd.Parameters.Append cmd.CreateParameter("@return_value", adInteger, adParamReturnValue)
'输入和输出的参数顺序同存储过程的参数顺序
cmd.Parameters.Append cmd.CreateParameter("@p", adInteger, adParamOutput)
cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput, , 1)
cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput, , 2)
cmd.CommandText = "sp_2"
cmd.CommandType = adCmdStoredProc
cmd.execute (执行到这会提示错误,就是我上面提到的“...多步 OLE DB...”)
Dim i As Integer
For i = 0 To cmd.Parameters.Count - 1
Debug.Print cmd.Parameters(i).name & "=" & cmd.Parameters(i).Value
Next i
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
要想正常的运行,需要把
Set cmd.ActiveConnection = CurrentProject.Connection 替换为:
Dim cn As New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=servername;Initial Catalog=datebasename;User ID=<username>;Password=<strong password>;"
Set cmd.ActiveConnection = cn
就可行了。
这是我自己的实践,如有什么错误,希望提示,大家共同学习。