有个群友问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. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...

  3. excel 日期/数字格式不生效需要但双击才会生效的解决办法

    原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...

  4. JavaScript 对象属性介绍

    本篇主要介绍JS中对象的属性,包括:属性的分类.访问方式.检测属性.遍历属性以及属性特性等内容. 目录 1. 介绍:描述属性的命名方式.查找路径以及分类 2. 属性的访问方式:介绍'.'访问方式.'[ ...

  5. console的高级使用

    1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...

  6. AES加密

    package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...

  7. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  8. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  9. 【转】外部应用和drools-wb6.1集成解决方案

    一.手把手教你集成外部应用和drools workbench6.1 1.         首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...

  10. psoc学习

    第一是:项目的路径需要放在Documents and Settings\,也就是默认的文件夹的地方,不然会报错错误范例为:Question:CY8CKIT-023 kit example projec ...