以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  储存过程中的输出参数与返回值的区别  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=125728)

--  作者:happyft
--  发布时间:2018/10/5 10:50:00
--  储存过程中的输出参数与返回值的区别

Dim cmd As new SQLCommand
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "GetOrderByID"
cmd
.StoredProcedure = True
cmd
.Parameters.Add("@Err", 12, False) \'返回参数
cmd
.Parameters.Add("@订单编号","1002") \'输入参数
cmd
.Parameters.Add("@日期", date.today, True) \'输出参数
cmd
.ExecuteNonQuery
Output
.Show( cmd.Parameters("@日期"))
Output
.Show( cmd.Parameters("@Err"))


1 返回参数是指储存过程是否执行成功的那个返回值吗? 比如一般成功时会返回0.

  返回参数与输出参数有什么不同?

cmd.Parameters.Add("@Err"12, False\'返回参数 这句中12是什么意思,是表示没有执行成功是返回的默认值吗?

  cmd.Parameters.Add("@日期", date.today, True\'输出参数 同理这个date.Today也是表示输出参数如果没有输出值时默认是今天吗?

  上面两句中不管返回参数还是输出参数都是获取从储存过程中得到的值,为什么中间那个参数值是一个常量值,所以不太理解


谢谢!


--  作者:有点甜
--  发布时间:2018/10/5 10:59:00
--  

1、返回参数,是存储过程中return的值,输出参数,是存储过程中output的值。

 

2、是的,第二个参数是默认返回的值,你测试一下便知。


--  作者:HappyFt
--  发布时间:2018/10/5 11:24:00
--  
我昨天问的那个出错视图查询调用会出错
     WHILE @@fetch_status = 0
            BEGIN
                BEGIN TRY
                    EXEC sp_refreshview @name;
                END TRY
                BEGIN CATCH
                    SET @names = @names + \',\' + @name; --记录出错的视图
                    ROLLBACK;
                    FETCH NEXT FROM MyCursor INTO @name;
                END CATCH;
                FETCH NEXT FROM MyCursor INTO @name;
            END;
        CLOSE MyCursor;
        DEALLOCATE MyCursor;
        --PRINT @names  --已经可以正确打印出来  ,uv_sc115,uv_sc120,uv_wx125,uv_wx126,uv_yjrk_sc这几个出错的视图
       RETURN @names;

储存过程中已经正确显示了,现在我是想在ft中调用所以最后一句改用 return 想返回这几个出错的视图名称到前台 
前台调用的代码
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
cmd.CommandText = "Exec ? = usp_RefreshAllView"  \'没有输入参数只有一个返回参数
cmd.Parameters.Add("@tbnames","无" , False) \'用于获取存储过程的返回值,如果没有返回值时显示无
cmd.ExecuteNonQuery
msgbox( cmd.Parameters("@tbnames"))

但运行会出错,显示错误如下:
String[0]: Size 属性具有无效大小值 0。



--  作者:有点甜
--  发布时间:2018/10/5 11:28:00
--  

这样写

 

Dim cmd As new SQLCommand
cmd.ConnectionName = "数据源名称"
cmd.CommandText = "usp_RefreshAllView"
cmd.StoredProcedure = True

cmd.Parameters.Add("@abc", "123", False) \'返回参数
cmd.ExecuteNonQuery
msgbox(cmd.Parameters("@abc"))

[此贴子已经被作者于2018/10/5 11:28:06编辑过]

--  作者:HappyFt
--  发布时间:2018/10/5 11:38:00
--  
还是会出相同的错误,
但如果储存过程中定义一个输出参数输出,最后一句改为 SET @errnames = @names --@errnames为输出参数
前台用下面的语句就正确
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
cmd.CommandText = "Exec usp_RefreshAllView ? output"
cmd.Parameters.Add("@tbnames","" , True)\'输出参数
cmd.ExecuteNonQuery
msgbox( cmd.Parameters("@tbnames"))

所以不太理解返回参数到底该怎么用

--  作者:有点甜
--  发布时间:2018/10/5 12:25:00
--  

第四个参数,帮助文档这样说

 

Size 整数型,用于指定输入参数或返回参数的大小,默认为32,只有字符型的参数才需要设定。

 

Dim cmd As new SQLCommand
cmd.ConnectionName = "数据源名称"
cmd.CommandText = "usp_RefreshAllView"
cmd.StoredProcedure = True

cmd.Parameters.Add("@abc", "123", False, 1024) \'返回参数
cmd.ExecuteNonQuery
msgbox(cmd.Parameters("@abc"))


--  作者:HappyFt
--  发布时间:2018/10/5 13:11:00
--  
还是不行,是不是储存过程中return后面不能是字符? 即最后那句RETURN @names有问题
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
cmd.CommandText = "usp_RefreshAllView"
cmd.StoredProcedure = True
cmd.Parameters.Add("@tbnames",12,False,1024)  \'出错提示不相同
--cmd.Parameters.Add("@tbnames","12",False,1024) 
cmd.ExecuteNonQuery
msgbox( cmd.Parameters("@tbnames"))

因为如果把上面12两边不用双引号,出错时提示
在将 nvarchar 值 \',uv_sc115,uv_sc120,uv_wx125,uv_wx126,uv_yjrk_sc\' 转换成数据类型 int 时失败。

而12两边加双引号则提示
String[0]: Size 属性具有无效大小值 0。

如果储存过程中最后改用帮助中的
 IF @@Error <> 0
     RETURN -1
   ELSE
     RETURN 100
测试就可以正常返回100


--  作者:有点甜
--  发布时间:2018/10/5 16:34:00
--  

哦,对了,return值,只能返回整型。

 

如果要返回字符类型,只能用output参数返回。