以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  sqlcommand写成 一行时如何获取储存过程的返回参数  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=159226)

--  作者:happyft
--  发布时间:2020/12/17 19:06:00
--  sqlcommand写成 一行时如何获取储存过程的返回参数
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

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

谢谢!



--  作者:有点蓝
--  发布时间:2020/12/17 20:23:00
--  
有什么复杂的?也就添加几个参数多几行代码,代码更有条理。拼凑字符串的连自己都不知道怎么拼,不更复杂,更容易出错,更浪费时间?

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

--  作者:HappyFt
--  发布时间:2020/12/17 21:18:00
--  
谢谢蓝老师,现在也都是用上面的写法,只是想了解下写成一行那种如何写及获取返回参数,想增加点知识而已
--  作者:有点蓝
--  发布时间:2020/12/17 22:04:00
--  
只有通过参数化的方式才能获取返回参数。拼凑字符串的用法只能是在存储过程里最后使用select语句返回数据
--  作者:HappyFt
--  发布时间:2020/12/18 9:00:00
--  
遇到一个问题,1楼中传参时,如果其中一个参数没有值时就会出现下面的错误

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

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

--  作者:有点蓝
--  发布时间:2020/12/18 9:11:00
--  
贴出具体代码说明
--  作者:HappyFt
--  发布时间: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

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

--  作者:有点蓝
--  发布时间:2020/12/18 10:26:00
--  
存储过程usp_pageTree_inout10代码发上来
--  作者:HappyFt
--  发布时间: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;


--  作者:有点蓝
--  发布时间: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)) \'输入参数