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


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

主题: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

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

谢谢!



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


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 20:23:00 [只看该作者]

有什么复杂的?也就添加几个参数多几行代码,代码更有条理。拼凑字符串的连自己都不知道怎么拼,不更复杂,更容易出错,更浪费时间?

再说了参数化的方式效率也比直接拼sql的高,还可以防止sql注入入侵,何必舍本逐末?

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


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

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

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


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 22:04:00 [只看该作者]

只有通过参数化的方式才能获取返回参数。拼凑字符串的用法只能是在存储过程里最后使用select语句返回数据

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
因为虽然有多个参数,但其中一两个有时为空是很正常的,这种情况应该如何处理?
谢谢!

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


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/18 9:11:00 [只看该作者]

贴出具体代码说明

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

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

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


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/18 10:26:00 [只看该作者]

存储过程usp_pageTree_inout10代码发上来

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | 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;


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


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/18 11:10:00 [只看该作者]

cmd.Parameters.Add("@目录树列", IIF(sqlcol Is Nothing,dbnull.value,sqlcol) ) '输入参数
cmd.Parameters.Add("@目录树排序",IIF(trSort Is Nothing,dbnull.value,trSort )) '输入参数
cmd.Parameters.Add("@条件",IIF(Filter Is Nothing,dbnull.value,Filter)) '输入参数

 回到顶部
总数 11 1 2 下一页