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. Python3.6安装使用tesserocr文件时遇到问题

    本机运行环境: Win 10 version 1709; Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit ...

  2. hbase 快速开发

    hbase是一个分布式的NoSQL,部署起来配置很多东西,开发起来太慢,可以使用docker快速搭建环境 gs@gs-virtual-machine:~$ sudo docker run -ti ha ...

  3. postman 做接口测试之学习笔记

    Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...

  4. git基本操作及上传代码到gitHub

    1.基本配置: 配置用户名:git config --global user.name" "; 配置邮箱:git config --global user.email " ...

  5. eclipse添加spring boot 插件

    在使用eclipse开发时,一般需要添加spring boot的管理插件,这样更方便我们开发,在写application.yml或properties配置的时候,也有相关的提示,而且还可以从配置文件中 ...

  6. Java基础(basis)-----关键字final和static的作用

       1.关键字final      final修饰类:这个类就不能被继承      final修饰方法:不能被重写      final修饰属性:此属性就是一个常量,一旦初始化后,不可再被赋值.习惯 ...

  7. idea 更换svn地址

    右键项目-->Subversion-->Relocate 上面是旧的SVN地址,下面填入你要更换的目标SVN地址

  8. 第三篇——Struts2的动态方法调用

    Struts2动态方法调用 默认方式:默认执行方法中的execute方法,若指定类中没有该方法,默认返回success: method方式:执行method属性中定义的方法,没有该方法,页面报错: 通 ...

  9. L1-049. 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  10. 2019/4/2 wen 多态、抽象