0

我有一個數據調用方法返回類型ItemDatumCollection的SubSonic集合。如何使用SPROC參數從SubSonic SPROC調用返回強類型對象?

的存儲過程作爲執行如下:

itemDatumCollection.LoadAndCloseReader(sp.GetReader()); 

但是,我無法訪問以這種方式存儲過程的輸出參數,因爲我能夠調用sp.GetDataSet()的時候如下做:

  itemsDataSet = sp.GetDataSet(); 

      actualNumberOfResults = ((Int64)sp.OutputValues[1]); 
      numberOfResultsReturned = ((Int64)sp.OutputValues[2]); 

是否有與第一種方法來訪問存儲過程的輸出參數的方式 - 從我的存儲過程調用返回亞音速強類型集合?

謝謝。

回答

0

我想做類似的事情,並最終改變了大部分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參數類型的列的文件。

...希望這有助於某種方式...