关于vs调用数据库存储过程 返回输出参数的一些总结
1.直接上练习的存储过程,方便回想
create proc proc_output
@totlecount int output,
@pageIndex int,
@pageSize int
as
declare @filter Nvarchar(800)
if OBJECT_ID('Test.dbo.#temp3','U') IS NOT NULL
begin
drop table #temp3
end
set @filter='select identity(int,1,1) as id,* into #temp3 from (
select name from t1 group by name
) as table2;
select * from #temp3 where id between '+CONVERT(VARCHAR(8),(@pageSize*(@pageIndex-1)+1))+' and '+CONVERT(VARCHAR(8),@pageIndex*@pageSize)+';
select @Count=count(1) from #temp3'
exec sp_executesql @filter,N'@Count int output',@totlecount output
2.在执行这个存储过程时,报错:
消息 214,级别 16,状态 2,过程 sp_executesql,第 3 行
过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'。
原因是:需要将定义的@filter 定义为Nvarchar类型,当定义为varchar时会出现上述错误。
3.在数据库执行存储过程的结果:
4.原本的想法是:数据库进行了复杂的查询(当进行多表联合查询以及select查询拼接新表时)得到临时表,
想省去一个单独查询符合分页条件总数量的存储过程原因是要进行相同的临时表创建,当数据量特别大时页面相应的时间
会比较长。现实是读数据需要调用ExecuteReader方法读取数据,想要得到output参数需要调用ExecuteNonQuery方法得到
输出参数。当调用ExecuteReader方法时,DAL层 param[0].Direction = ParameterDirection.Output;
totleCount =param[0].Value == DBNull.Value ? 0 : Convert.ToInt32(param[0].Value); 这时候的param[0].Value 值为null;
当再调用ExecuteNonQuery方法时,会得到6;(作为一个坑总结一下)
5.那么问题出来了 ,还是调用了两次同一个存储过程,换句话说数据库的查询量并没有减少...........
6.于是乎在返回的表里临时添加了一列,记录符合条件的总的信息条数。
将存储过程的“select * from #temp3 where id between '+CONVERT(VARCHAR(8),(@pageSize*(@pageIndex-1)+1))+' and '+CONVERT(VARCHAR(8),@pageIndex*@pageSize)+';
select @Count=count(1) from #temp3” 修改为了“select * ,
(select count(1) from #temp3) as totleCount
from #temp3 where id between '+CONVERT(VARCHAR(8),(@pageSize*(@pageIndex-1)+1))+' and '+CONVERT(VARCHAR(8),@pageIndex*@pageSize)+'”
这样调用ExecuteReader方法时,就会得到符合查询条件的信息条数。缺点是返回的每一条数据都有这个信息。
所以需要判断得到list的长度,当>0时,获取list[0].totleCount即是总条数否则为0
7.修改完成的存储过程
alter proc proc_output
@pageIndex int,
@pageSize int
as
declare @filter Nvarchar(800)
if OBJECT_ID('Test.dbo.#temp3','U') IS NOT NULL
begin
drop table #temp3
end
set @filter='select identity(int,1,1) as id,* into #temp3 from (
select name from t1 group by name
) as table2;
select *,(select count(1) from #temp3) as totleCount from #temp3 where id between '+CONVERT(VARCHAR(8),(@pageSize*(@pageIndex-1)+1))+' and '+CONVERT(VARCHAR(8),@pageIndex*@pageSize)+';
'
exec (@filter)
8.执行结果:
9.想多了系列
关于vs调用数据库存储过程 返回输出参数的一些总结的更多相关文章
- ADO.NET 快速入门(三):从存储过程获取输出参数
一些存储过程通过参数返回值.当参数在SQL表达式或者存储过程中被定义为“输出”,参数值会返回给调用者.返回值存储在 OleDbCommand 或者 SqlCommand 对象的参数集合的参数里. ...
- Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数
10-2. 返回输出参数 问题 想获取存储过程里的一个或多个输出参数的值 解决方案 假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型 Figure 10-1.出租车辆与租金收入的 ...
- 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- c#调用oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- C#调用存储过程带输出参数或返回值
CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...
- [转] ADO.NET调用存储过程带输出参数或返回值
CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(), @studentname nvarchar() OUTPUT AS BEGIN S ...
- Asp.Net中调用存储过程并返回输出参数
/// <summary> /// 调用存储过程返回参数 /// </summary> /// <param name="orderId">&l ...
- mybatis 调用mysql存储过程 带输出输入参数
http://lohasle.iteye.com/blog/1669879 存储过程都是一样的,只是根据自己的喜好,可以用MAP或者JAVABEAN传递参数. -- ----------------- ...
随机推荐
- 原生js阻止表单跳转
/* W3C浏览器下的 */ var forms = document.getElementById("from") forms.addEventListener('submit' ...
- Spring框架的第三天
## Spring框架的第三天 ## ---------- **课程回顾:Spring框架第二天** 1. IOC的注解方式 * @Value * @Resource(name="" ...
- Streaming从Spark2X迁移到Spark1.5 summary
配置文件的加载是一个难点,在local模式下非常容易,但是submit后一直报找不到文件,后来采用将properties文件放在加载类同一个package下,打包到同一个jar中解决. import ...
- Windbg程序调试系列1-Mex扩展使用总结
最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...
- py-faster-rcnn代码
1. 对proposal层NMS的解释,很清晰 注意第18~20行是拿一个数(x1)和array(x1[ [0,2,3] ])去比:
- Linux基础命令---lprm删除打印任务
lprm lprm指令用来删除当前打印队列上的任务,如果没有指定,那么就删除当前打印任务.您可以指定一个或多个职务ID编号来取消这些职务,或者使用选项”-”取消所有作业. 此命令的适用范围:RedHa ...
- Centos安装Python各版本解释器并配置pip
Centos7.3安装Python3.7 Python3.7貌似又多了新的依赖,所以按照安装之前的套路安装在配置pip阶段就会出问题,比如: ModuleNotFoundError: No modul ...
- CSS 使用技巧
CSS 使用技巧 1.CSS代码重用,解决同一类样式下相同冲突点 <style> .c { 共有 } .c1 { 独有 } .c2 { 独有 } </style> <di ...
- Docker OpenvSwitch 应用部署
Docker OpenvSwitch 应用部署 安装部署OVS并建立GRE隧道 节点1:192.168.1.198 容器网段:172.17.1.0/24 节点2:192.168.1.199 容器网段: ...
- 剑指offer(23)二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...