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调用数据库存储过程 返回输出参数的一些总结的更多相关文章

  1. ADO.NET 快速入门(三):从存储过程获取输出参数

    一些存储过程通过参数返回值.当参数在SQL表达式或者存储过程中被定义为“输出”,参数值会返回给调用者.返回值存储在 OleDbCommand 或者 SqlCommand 对象的参数集合的参数里.   ...

  2. Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数

    10-2. 返回输出参数 问题 想获取存储过程里的一个或多个输出参数的值 解决方案 假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型 Figure 10-1.出租车辆与租金收入的 ...

  3. 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  4. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  5. c#调用oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  6. C#调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

  7. [转] ADO.NET调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(), @studentname nvarchar() OUTPUT AS BEGIN S ...

  8. Asp.Net中调用存储过程并返回输出参数

    /// <summary> /// 调用存储过程返回参数 /// </summary> /// <param name="orderId">&l ...

  9. mybatis 调用mysql存储过程 带输出输入参数

    http://lohasle.iteye.com/blog/1669879 存储过程都是一样的,只是根据自己的喜好,可以用MAP或者JAVABEAN传递参数. -- ----------------- ...

随机推荐

  1. Vue引入elementUI组件全过程

    参考:https://www.cnblogs.com/fubinbin/p/9938528.html 在vue脚手架安装完成之后,页面正常跳出vue刚安装完的界面 我们开始引入elementui 1. ...

  2. 《linux就该这么学》第二节课,安装红帽7,基础命令至2.3小节的笔记

    笔记 实验环境: 1.安装注意事项:使用VM12版本   安装需要稍后安装系统.   自定义硬件DVD选择镜像位置.   自定义网卡仅主机.   自定义内存:大于等于4G,给予虚拟机2G,大于2G小于 ...

  3. SiteCore Experience Analytics-路径分析地图

    路径分析地图 路径分析器是一个应用程序,允许您查看联系人在浏览网站时所采用的各种路径.您可以查看联系人在转换目标并与广告系列互动时所采用的路径,让您深入了解哪些路径为每次转化提供最佳参与价值,以及哪些 ...

  4. JavaScript--浅谈!=、!==、==和===的区别

    == 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 === 和 !== 只有在相同类型下,才会比较其值 <!DOCTYPE html> <html> ...

  5. 软件工程实践小项目之模拟wc.exe的小程序

    github源码和工程文件地址:https://github.com/Jackchenyu/Word_counts/tree/smart 基本要求:要实现wc的基本功能即文件中字符数.单词数.行数的统 ...

  6. Solr入门介绍

    solr入门案例 solr是apache下的一个全文检索引擎系统. 我们需要在服务器上单独去部署solr, 通过它的客户端工具包solrJ, 就是一个    jar包, 集成到我们项目中来调用服务器中 ...

  7. phpstorm2018激活方法

    直接用浏览器打开 http://idea.lanyus.com/点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串如果提示红字体信息,那么先 ...

  8. 配置cron定时任务

    题:配置一个 cron 任务用户 natasha 必须配置一个定时执行任务,每天在本地时间 14:23 时执行命令* /bin/echo hiya 答: # 方法1 # su - natasha # ...

  9. HTTP的简单的解析

    HTTP 中文全称为超文本传输协议是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途 ...

  10. 将nginx添加至service服务

    一.问题描述: 无法用service命令启动nginx 二.问题分析: /etc/init.d/目录下缺少nginx默认启动脚本 三.问题解决: 在/etc/init.d/路径下添加脚本文件,名称为n ...