首页 > 代码库 > SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改
SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改
有个群友问SubSonic3.0执行存储过程时能不能使用output参数返回值,说测试过后获取不到返回值,早上有些时间所以就尝试修改了一下
首先在数据库中创建一个存储过程
1 CREATE PROCEDURE [OutValue]2 @a int,3 @b int, 4 @c int output5 AS6 Set @c = @a + @b7 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-2711 * 修改说明:添加存储过程说明参数,用于判断该参数是否是返回值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 群:32736070823 * 博客地址:http://www.cnblogs.com/EmptyFS/24 * 修改时间:2014-06-2725 * 修改说明:添加存储过程说明参数,用于判断该参数是否是返回值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 else30 {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原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。
发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。
更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。