我想做類似的事情,並最終改變了大部分StoredProcedures.tt文件,我認爲一些SubSonic的內部。沒有得到太多的細說,我改變了由.TT文件,以便它會產生這樣一個給定存儲過程:
public void COMPANIES_ACTIVATE_PACKAGE(long PI_COMPANY_ID, string PI_ACTIVE, long PI_USER_ID, out long PO_ERRCODE, out string PO_ERRMSG, out string PO_ORA_ERRMSG){
StoredProcedure sp=new StoredProcedure("COMPANIES.ACTIVATE_PACKAGE",this.Provider);
sp.Command.AddParameter("PI_COMPANY_ID",PI_COMPANY_ID,DbType.Decimal);
sp.Command.AddParameter("PI_ACTIVE",PI_ACTIVE,DbType.AnsiString);
sp.Command.AddParameter("PI_USER_ID",PI_USER_ID,DbType.Decimal);
sp.Command.AddOutputParameter("PO_ERRCODE",DbType.AnsiString);
sp.Command.AddOutputParameter("PO_ERRMSG",DbType.AnsiString);
sp.Command.AddOutputParameter("PO_ORA_ERRMSG",DbType.AnsiString);
sp.Execute();
var prms = sp.Command.Parameters;
PO_ERRCODE = ConvertValue<long>(prms.GetParameter("PO_ERRCODE").ParameterValue);
PO_ERRMSG = ConvertValue<string>(prms.GetParameter("PO_ERRMSG").ParameterValue);
PO_ORA_ERRMSG = ConvertValue<string>(prms.GetParameter("PO_ORA_ERRMSG").ParameterValue);
}
所以基本上我通過在任何存儲過程的參數,並有回定義「出」參數值。
也沒有在這裏顯示,但如果我有一個InOut參數,那麼我通過它ref
而不是out
。
然後在我的實際應用程序代碼中,我可以調用存儲過程像任何其他功能:
long errorCode;
string errorMsg, oraErrorMsg;
db.COMPANIES_ACTIVATE_PACKAGE(123, "Y", 456, out errorCode, out errorMsg, out oraErrorMsg);
if(errorCode > 0)
// ... handle error...
我不知道這是否會堵塞右中沒有進一步的變化SS,但這是我的.tt文件。你也許能夠使用它,或者至少拿到哪裏去了一些想法:
StoredProcedures.tt:
<#@ template language="C#" debug="False" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ include file="DB2DataProvider.ttinclude" #>
<#
var sps = GetSPs();
if(sps.Count>0){
#>
using System;
using System.Data;
using System.ComponentModel;
using SubSonic;
using SubSonic.Schema;
using SubSonic.DataProviders;
namespace <#=Namespace#>{
public partial class <#=DatabaseName#>DB{
public T ConvertValue<T>(object paramVal)
{
if (paramVal == null || Convert.IsDBNull(paramVal)) // if the value is null, return the default for the desired type.
return default(T);
if (typeof(T) == paramVal.GetType()) // if types are already equal, no conversion needed. just cast.
return (T)paramVal;
else // types don't match. try to convert.
{
var conversionType = typeof(T);
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
NullableConverter nullableConverter = new NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}
return (T)Convert.ChangeType(paramVal, conversionType);
}
}
<# foreach(var sp in sps){#>
public void <#=sp.CleanName#>(<#=sp.ArgList#>){
StoredProcedure sp=new StoredProcedure("<#=sp.Name#>",this.Provider);
<# foreach(var par in sp.Parameters) {
if(par.In && !par.Out) {#>
sp.Command.AddParameter("<#=par.Name#>",<#=par.CleanName#>,DbType.<#=par.DbType#>);
<# } else if(!par.In && par.Out) {#>
sp.Command.AddOutputParameter("<#=par.Name#>",DbType.<#=par.DbType#>);
<# } else {#>
sp.Command.AddParameter("<#=par.Name#>",<#=par.CleanName#>,DbType.<#=par.DbType#>,ParameterDirection.InputOutput);
<# }}#>
sp.Execute();
<# bool hasOut = false;
foreach(var par in sp.Parameters) {
if(par.Out)
hasOut = true;
}
if(hasOut) {
#>
var prms = sp.Command.Parameters;
<# }
foreach(var par in sp.Parameters) {
if(par.Out) {#>
<#=par.Name#> = ConvertValue<<#=par.SysType#>>(prms.GetParameter("<#=par.Name#>").ParameterValue);
<# }}#>
}
<# }#>
}
}
<# }#>
我敢肯定,我也不得不改變查詢負載在數據庫提供程序中存儲proc數據.ttinclude加載指示其是In,Out或InOut參數類型的列的文件。
...希望這有助於某種方式...