以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- sqlcommand写成 一行时如何获取储存过程的返回参数 (http://foxtable.com/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楼中传参时,如果其中一个参数没有值时就会出现下面的错误 难道每个参数在传入前都要用下面这样处理一下吗? 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)) \'输入参数
|