◎请教高手◎ 在VB中获取Return参数和多记录集的奇怪问题。

CDINnet 2005-01-24 05:33:38
/***********************************************************/

--假设存储过程如下:

Create proc Test3
@EName varchar(50),
@CName varchar(10),
@Count1 int output,
@Count2 int output
as
select @Count1 =100 '返回参数1
Select @Count2 = 200 '返回参数2
select Employee_Name from Employee '返回记录集1
Select Company_Name from Company '返回记录集2
return 1000 '返回值
***********************************************************/
Dim rs1 As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim Prm1 As ADODB.Parameter
Dim Prm2 As ADODB.Parameter
Dim Prm3 As ADODB.Parameter
Dim Prm4 As ADODB.Parameter
Dim Prm5 As ADODB.Parameter

cmd.CommandText = "Test3"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = connMain

Set Prm1 = cmd.CreateParameter(, adVarChar, adParamInput, 50, "李")
Set Prm2 = cmd.CreateParameter(, adVarChar, adParamInput, 10, "科技")
Set Prm3 = cmd.CreateParameter(, adInteger, adParamOutput)
Set Prm4 = cmd.CreateParameter(, adInteger, adParamOutput)
Set Prm5 = cmd.CreateParameter(, adInteger, adParamReturnValue)

With cmd.Parameters
.Append Prm5
.Append Prm1
.Append Prm2
.Append Prm3
.Append Prm4
End With

Set rs1 = cmd.Execute

debug.print cmd.Parameters(0).Value & " " & cmd.Parameters(3).Value & " " & cmd.Parameters(4).Value

set rs2 = rs1.NextRecordset
.....

问题:

1、如果将“Set rs1 = cmd.Execute”改为“cmd.Execute”,可以正确获取三个参数,但这样就获取不到记录集了。请问既能返回三个参数,又能获取记录集。(50分)
2、如果在存储过程中将两个Select语句去掉之后,则不管用“Set rs1 = cmd.Execute”还是“cmd.Execute”,都可以正确获取三个参数。难道Select语句对返回参数有什么影响吗。请问是什么原因,在写存储过程或者写VB代码是应注意些什么?(40)
3、Prm5是存储过程的Return参数,如果把 append Prm5语句放在 append prm4之后,则提示“为过程和函数Test3指定了过多的参数”。难道Return参数必须放在最前面Append吗?请问是什么原因?(10)
...全文
104 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
老汉 2005-01-24
  • 打赏
  • 举报
回复
学习。
leayh 2005-01-24
  • 打赏
  • 举报
回复
A :
1 & 2:其实这两个问题都可以用同一个答案来解决。你在AS语句之后、Select语句之前加上Set NoCount On这一句,然后在VB里用Set rs1 = cmd.Execute调用,就可以返回所有的记录集(其实参数也是以记录集的方式返回的)。
获取返回的参数语法:
Rs(0)就是@Count1的值,然后执行Rs.NextRecordset,就可以返回一个记录集了。
3:ReturnValue只是SQL用来返回执行存储过程状态,并无实际意义,没必要把一些必要的返回值放在这里,可以用你前面那种方式:Set @var=value。
CDINnet 2005-01-24
  • 打赏
  • 举报
回复
To leayh(云卷云舒)

我主要是要封装Connection、Recordest、Command等对象和方法到自定义类里面。

所以在上文中,希望能即返回参数值(包括Return),又返回记录集。这样外部调用要方便一些。否则全部按照记录集的读取方式,不符合很多程序员的风格。

我想知道,是不是如果要返回记录集,那么Output类型的参数和Return值就不能正确返回?有没有什么处理办法能完美的解决这个问题?

诚盼回复。

1,217

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧