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

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

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

1 CREATE PROCEDURE [OutValue]
2     @a int,
3     @b int,
4     @c int output
5 AS
6     Set @c = @a + @b
7 GO

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

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

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

 1 List<SPParam> GetSPParams(string spName){
 2     var result=new List<SPParam>();
 3     string dbName = null;
 4
 5     if(!String.IsNullOrEmpty(DatabaseName))
 6         dbName = DatabaseName;
 7
 8     string[] restrictions = new string[4] { dbName , null, spName, null };
 9
10     using(SqlConnection conn=new SqlConnection(ConnectionString)){
11         conn.Open();
12         var sprocs=conn.GetSchema("ProcedureParameters", restrictions);
13         conn.Close();
14         foreach(DataRow row in sprocs.Select("", "ORDINAL_POSITION")){
15             SPParam p=new SPParam();
16             p.SysType=GetSysType(row["DATA_TYPE"].ToString());
17             p.DbType=GetDbType(row["DATA_TYPE"].ToString()).ToString();
18             p.Name=row["PARAMETER_NAME"].ToString().Replace("@","");
19             p.CleanName=CleanUp(p.Name);
20             /*
21             * 修 改 人:Empty(AllEmpty)
22             * QQ    群:327360708
23             * 博客地址:http://www.cnblogs.com/EmptyFS/
24             * 修改时间:2014-06-27
25             * 修改说明:添加存储过程说明参数,用于判断该参数是否是返回值
26             *********************************************/
27             p.Direction=row["PARAMETER_MODE"].ToString();
28             result.Add(p);
29         }
30     }
31     return result;
32 }

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

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

  如图:

  

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

 1 <#@ template language="C#" debug="True" hostspecific="True"  #>
 2 <#@ output extension=".cs" #>
 3 <#@ include file="SQLServer.ttinclude" #>
 4 <#
 5     var sps = GetSPs();
 6     if(sps.Count>0){
 7 #>
 8 using System;
 9 using System.Data;
10 using SubSonic.Schema;
11 using SubSonic.DataProviders;
12
13 namespace <#=Namespace#>{
14     public partial class SPs{
15
16 <#  foreach(var sp in sps){#>
17         public static StoredProcedure <#=sp.CleanName#>(<#=sp.ArgList#>){
18             StoredProcedure sp=new StoredProcedure("<#=sp.Name#>");
19
20 <#
21         foreach(var par in sp.Parameters){
22             //检查是否是输出参数
23             if(par.Direction == "INOUT")
24             {
25 #>
26             sp.Command.AddOutputParameter("<#=par.Name#>",-1,DbType.<#=par.DbType#>);
27 <#
28             }
29             else
30             {
31 #>
32             sp.Command.AddParameter("<#=par.Name#>",<#=par.CleanName#>,DbType.<#=par.DbType#>);
33 <#
34             }
35         }
36 #>
37             return sp;
38         }
39 <#  }#>
40
41     }
42
43 }
44 <#  }#> 

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

 1 using System.Data;
 2 using SubSonic.Schema;
 3
 4 namespace Solution.DataAccess.DataModel{
 5     public partial class SPs{
 6
 7         public static StoredProcedure OutValue(int a,int b,int c){
 8             StoredProcedure sp=new StoredProcedure("OutValue");
 9
10             sp.Command.AddParameter("a",a,DbType.Int32);
11             sp.Command.AddParameter("b",b,DbType.Int32);
12             sp.Command.AddOutputParameter("c",-1,DbType.Int32);
13             return sp;
14         }
15     }
16
17 }

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

  

  返回结果是3,正确

 版权声明:

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

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

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

SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改,布布扣,bubuko.com

时间: 2024-10-12 04:04:22

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

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

本文基于Roslyn项目中的Issue:#347 展开讨论. 回顾 首先,提出一个问题,C#中,如何使一个方法可返回"多个"返回值? 我们先来回顾一下C#6.0 及更早版本的做法. 在C#中,通常我们有以下4种方式使一个方法返回多条数据. 使用 KeyValue 组合 1 static void Main(string[] args) 2 { 3 int int1 = 15; 4 int int2 = 25; 5 var result = Add_Multiply(int1, int2

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

如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 造成以上情况可能的原因: 1.级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在mybatis中主从表需要为相同字段名设置别名.设置了别名就OK了. 例子: 主表Standard, 从表StandEntity,均有名为id的字段 1 <resultMap id="StandardAndEntityResultMap" type="whu.edu.irlab

存储过程带事务,拼接id,返回值

出处:http://www.cnblogs.com/cmsdn/archive/2012/04/25/2469568.html 以下SQL以防以后还需用到,特此备份 删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL 1 ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] 2 ( 3 @leavewordID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 B

SqlServer 获得存储过程的返回值(参数返回),别玩了output

declare @dingdanid int declare @fanhuizhi int set @dingdanid = 1 exec 检测订单出库资格 @dingdanid ,@fanhuizhi output   (注意别忘了output否则返回值是NULL) select @fanhuizhi create proc dbo.检测订单出库资格 @dingdanID int,     @returnValue int output as -- 输入变量 订单编号 set @returnV

qt调用sql server存储过程并获取output参数

最近新做的一个项目需要使用qt连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章,如果是连接另一台机器的sql server就不用执行第一步“开启ODBC驱动”了 http://www.cnblogs.com/shaolw/p/3411285.html 另外指定数据库用户名和密码可以使用Uid和Pwd,即原文dsn参数可以这样写: QString dsn = QString("Driver={

将存储过程的返回值赋给变量

1.OUPUT参数返回值 复制代码代码如下: CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: 复制代码代码如下: DECLARE @o_buyerid int

jquery的ajax方法在无返回值时的返回值类型设定

2013-12-07 19:15:29|  分类: Web前端 |  标签:html  |举报|字号 订阅 $.ajax({ type: "post", url: "index.php", data: "id="+uid, dataType:"json", success : function(){ alert(1); }, error: function(){ alert(0); } }); 在jquery的ajax方法中,

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

存储过程输出参数、返回值、返回表及C#调用

存储过程中可以定义输出变量,返回值,执行存储过程还能获得结果集.每个存储过程的默认返回值为0.下面紧接着上文 SQL Server中存储过程Stored Procedure创建及C#调用 基础上写的一个新的Stored Procedure存储过程则包含了输出参数.返回值以及select结果. USE [db] GO /****** Object: StoredProcedure [dbo].[insert_persions] Script Date: 2/25/2015 11:14:11 AM