有个群友问SubSonic3.0执行存储过程时能不能使用output参数返回值,说测试过后获取不到返回值,早上有些时间所以就尝试修改了一下

  首先在数据库中创建一个存储过程

 CREATE PROCEDURE [OutValue]
@a int,
@b int,
@c int output
AS
Set @c = @a + @b
GO

  打开Settings.ttinclude模板,找到SPParam类,修改为下面代码

     public class SPParam{
public string Name;
public string CleanName;
public string SysType;
public string DbType;
/*
* 修 改 人:Empty(AllEmpty)
* QQ 群:327360708
* 博客地址:http://www.cnblogs.com/EmptyFS/
* 修改时间:2014-06-27
* 修改说明:添加存储过程说明参数,用于判断该参数是否是返回值
*********************************************/
public string Direction;
}

  打开SQLServer.ttinclude模板,找到GetSPParams函数,修改为下面代码

 List<SPParam> GetSPParams(string spName){
var result=new List<SPParam>();
string dbName = null; if(!String.IsNullOrEmpty(DatabaseName))
dbName = DatabaseName; string[] restrictions = new string[] { dbName , null, spName, null }; using(SqlConnection conn=new SqlConnection(ConnectionString)){
conn.Open();
var sprocs=conn.GetSchema("ProcedureParameters", restrictions);
conn.Close();
foreach(DataRow row in sprocs.Select("", "ORDINAL_POSITION")){
SPParam p=new SPParam();
p.SysType=GetSysType(row["DATA_TYPE"].ToString());
p.DbType=GetDbType(row["DATA_TYPE"].ToString()).ToString();
p.Name=row["PARAMETER_NAME"].ToString().Replace("@","");
p.CleanName=CleanUp(p.Name);
/*
* 修 改 人:Empty(AllEmpty)
* QQ 群:327360708
* 博客地址:http://www.cnblogs.com/EmptyFS/
* 修改时间:2014-06-27
* 修改说明:添加存储过程说明参数,用于判断该参数是否是返回值
*********************************************/
p.Direction=row["PARAMETER_MODE"].ToString();
result.Add(p);
}
}
return result;
}

  打开SubSonic3.0源码:Schema/StoredProcedure.cs,添加下面代码

         /// <summary>
/// 修 改 人:Empty(AllEmpty)
/// QQ 群:327360708
/// 博客地址:http://www.cnblogs.com/EmptyFS/
/// 修改时间:2014-06-27
/// 功能说明:执行存储过程,返回OutputValues
/// </summary>
public List<object> ExecuteReturnValue()
{
Provider.ExecuteQuery(Command);
return Command.OutputValues;
}

  如图:

  

  打开StoredProcedures.tt模板,修改为下面代码

 <#@ template language="C#" debug="True" hostspecific="True"  #>
<#@ output extension=".cs" #>
<#@ include file="SQLServer.ttinclude" #>
<#
var sps = GetSPs();
if(sps.Count>){
#>
using System;
using System.Data;
using SubSonic.Schema;
using SubSonic.DataProviders; namespace <#=Namespace#>{
public partial class SPs{ <# foreach(var sp in sps){#>
public static StoredProcedure <#=sp.CleanName#>(<#=sp.ArgList#>){
StoredProcedure sp=new StoredProcedure("<#=sp.Name#>"); <#
foreach(var par in sp.Parameters){
//检查是否是输出参数
if(par.Direction == "INOUT")
{
#>
sp.Command.AddOutputParameter("<#=par.Name#>",-1,DbType.<#=par.DbType#>);
<#
}
else
{
#>
sp.Command.AddParameter("<#=par.Name#>",<#=par.CleanName#>,DbType.<#=par.DbType#>);
<#
}
}
#>
return sp;
}
<# }#> } }
<# }#>

  运行修改好的StoredProcedures.tt模板,生成存储过程函数

 using System.Data;
using SubSonic.Schema; namespace Solution.DataAccess.DataModel{
public partial class SPs{ public static StoredProcedure OutValue(int a,int b,int c){
StoredProcedure sp=new StoredProcedure("OutValue"); sp.Command.AddParameter("a",a,DbType.Int32);
sp.Command.AddParameter("b",b,DbType.Int32);
sp.Command.AddOutputParameter("c",-1,DbType.Int32);
return sp;
}
} }

  搞定后我们运行执行一下这段存储过程看看有没有返回我们想要的结果(1+2=?)

  

  返回结果是3,正确

 版权声明:

  本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。

  发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。

  更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改的更多相关文章

  1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  2. SubSonic3.0插件分页查询速度测试

    使用SubSonic3.0一段时间了,一直都想找机会测试一下各种查询分页速度,对比一下插件的查询效率到底怎么样,所以昨天写好了测试程序,准备好1K.1W.10W.50W和100W记录的数据表,早上详细 ...

  3. .net 存储过程中的 output参数取值问题

    当存储过程中多个结果需要返回时经常需要用到output类型的参数,如果存储过程没有返回结果集只是输出output类型参数时使用如下代码: db.AddOutParameter(dbCmd, " ...

  4. mybatis 关联查询时,从表只返回第一条记录解决办法

    如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 造成以上情况可能的原因: 1.级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在my ...

  5. Angular中ViewChild\ngAfterViewInit\Promise的使用,在父组件初始化时等待子组件的返回值

    1.子component中的异步方法 initCreateJob = () => new Promise((resolve, reject) => { setTimeout(() => ...

  6. SqlServer如何获取存储过程的返回值

    1.Output参数返回值 1 CREATE PROCEDURE [dbo].[upInformation]( 2 @age int , 3 @id bigint OUTPUT 4 ) 5 AS 6 ...

  7. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  8. EF 6 调用存储过程时返回多结果集和OUTPUT参数问题

    原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...

  9. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

随机推荐

  1. .net core快速上手

    2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...

  2. Summary of Critical and Exploitable iOS Vulnerabilities in 2016

    Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...

  3. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  4. iOS逆向工程之App脱壳

    本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解 ...

  5. Ajax使用WCF实现小票pos机打印源码

    通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq  22945 ...

  6. BPM生产安全管理解决方案分享

    一.方案概述生产安全管理是企业生产管理的重要组成部分,组织实施好企业安全管理规划.指导.检查和决策,保证生产处于最佳安全状态是安全管理的重要内容和职责.H3 BPM企业生产安全管理解决方案是一套专门为 ...

  7. 查看mac中磁盘空间占用情况

    今天发现磁盘空间不够了,首先要找到那些文件夹占用了磁盘空间. du命令很好使 du -c -d 1 -m | sort -n -c 显示当前文件夹总计占用空间 -d 1 层级为1,即只显示当前目录下一 ...

  8. Oracle Standard Error 列表

    今天,我特意从网上找了一些,以及自己平时总结的,关于错误编号和说明,平时我们在写项目的时候,往往是可能会出现下面这些错误,例如:违反唯一约束,无效的会话ID,等等.希望对大家有点帮助!可以看看,如果有 ...

  9. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  10. 机器学习之sklearn——EM

    GMM计算更新∑k时,转置符号T应该放在倒数第二项(这样计算出来结果才是一个协方差矩阵) from sklearn.mixture import GMM    GMM中score_samples函数第 ...