Foxtable(狐表)用户栏目专家坐堂 → sqlcommand写成 一行时如何获取储存过程的返回参数


  共有2867人关注过本帖树形打印复制链接

主题:sqlcommand写成 一行时如何获取储存过程的返回参数

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
sqlcommand写成 一行时如何获取储存过程的返回参数  发帖心情 Post By:2020/12/17 19:06:00 [显示全部帖子]

Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
cmd.CommandText = "exec usp_pageLoad_inout10 ?,?,?,?,?,?,? output"
cmd.Parameters.Add("@分页列", ldpagecol) '输入参数
cmd.Parameters.Add("@排序",Loadorder) '输入参数
cmd.Parameters.Add("@第几页",page) '输入参数
cmd.Parameters.Add("@条件",Filter) '输入参数
cmd.Parameters.Add("@开始行",r1) '输入参数
cmd.Parameters.Add("@结束行",r2) '输入参数
cmd.Parameters.Add("@记录数", "", True) '输出参数
Dim dt As DataTable  = cmd.ExecuteReader
If cmd.Parameters("@记录数") > 0 Then
    RowsTotal = cmd.Parameters("@记录数")
End If

'cmd.CommandText = "Exec usp_pageLoad_inout10 '" & ldpagecol & "','" & Loadorder & "'," & page & ",'" & Filter & "'," & r1 & "," & r2

储存过程有六个输入参数, 一个返回参数,上面的写法感觉很复杂,如果要写成红色一行那样,应该如何写,此时怎么样获取到返回参数?

谢谢!



 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2020/12/17 21:18:00 [显示全部帖子]

谢谢蓝老师,现在也都是用上面的写法,只是想了解下写成一行那种如何写及获取返回参数,想增加点知识而已

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2020/12/18 9:00:00 [显示全部帖子]

遇到一个问题,1楼中传参时,如果其中一个参数没有值时就会出现下面的错误

图片点击可在新窗口打开查看此主题相关图片如下:储存过程错误.jpg
图片点击可在新窗口打开查看

难道每个参数在传入前都要用下面这样处理一下吗?
If Filter Is Nothing Then
        Filter = "1 = 1"
End If
因为虽然有多个参数,但其中一两个有时为空是很正常的,这种情况应该如何处理?
谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2020/12/18 10:14:00 [显示全部帖子]

前台代码如下:
Dim trRows,trPage As Integer
Dim sqlcol,Filter,trc As String

....生成每个输入参数的代码(略)

If trc > "" Then
    trc = trc.trim(",")
End If
'---查询数据到临时表中
sqlcol = sqlcol.replace("|",",")
If trSort = "" Then
    trSort = sqlcol
End If
If Filter Is Nothing Then
    Filter = "1 = 1"
End If

Dim r1 As Integer = (trPage - 1) * trRows
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
cmd.CommandText = "exec usp_pageTree_inout10 ?,?,?,?,?" 
cmd.Parameters.Add("@目录树列",sqlcol) '输入参数
cmd.Parameters.Add("@目录树排序",trSort) '输入参数
cmd.Parameters.Add("@条件",Filter) '输入参数
cmd.Parameters.Add("@记录数",trRows) '输入参数
cmd.Parameters.Add("@开始行",r1) '输入参数
Dim dt As DataTable  = cmd.ExecuteReader

不论哪一个输入参数为空,执行时就会提示没有传入这个参数

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2020/12/18 10:35:00 [显示全部帖子]

 --目录树分页
ALTER PROCEDURE [dbo].[usp_pageTree_inout10]
    @sqlcol NVARCHAR(100) ,--目录树列
    @trSort NVARCHAR(100) ,--目录树列排序
    @whereflt NVARCHAR(MAX) ,--筛选条件
    @trRows INT ,--目录树记录数
    @rowS INT --开始行
AS
    SET NOCOUNT ON;
    IF OBJECT_ID('tempdb..#temp') IS NOT NULL  --盘点数量
        DROP TABLE #temp;
           
    DECLARE @sql NVARCHAR(MAX); --动态sql语句
    IF @whereflt IS NOT NULL     --有筛选条件加上
        BEGIN
            SET @sql = 'select a.* into #temp from ( SELECT ROW_NUMBER() OVER ( ORDER BY '
                + @trSort + ') AS RowNum,* FROM ( SELECT DISTINCT ' + @sqlcol
                + ' FROM  uv_kc105 ) x where ' + @whereflt + ') a'; 
        END;
    ELSE
        BEGIN
    
            SET @sql = 'select a.* into #temp from ( SELECT ROW_NUMBER() OVER ( ORDER BY '
                + @trSort + ') AS RowNum,* FROM ( SELECT DISTINCT ' + @sqlcol
                + ' FROM  uv_kc105 ) x ) a'; 
        END;
    --通过查询#temp 表得到生成目录树的表
    SET @sql = @sql + ' select top ' + CAST(@trRows AS NVARCHAR(8)) + ' '
        + @trCol + ' from #temp where rowNum >= ' + CAST(@rowS AS NVARCHAR(8));
    EXEC sp_executesql @sql;
    
    SET NOCOUNT OFF;


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1925 积分:17344 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2020/12/18 11:43:00 [显示全部帖子]

可以了,谢谢!

 回到顶部