如何从具有SPROC参数的SubSonic SPROC调用返回强类型对象?

| 我有一个数据调用者方法,该方法返回类型为ItemDatumCollection的SubSonic集合。 sproc执行如下:
itemDatumCollection.LoadAndCloseReader(sp.GetReader());
但是,我无法以这种方式访问​​sproc的输出参数,就像在调用sp.GetDataSet()时所做的那样:
            itemsDataSet = sp.GetDataSet();

            actualNumberOfResults = ((Int64)sp.OutputValues[1]);
            numberOfResultsReturned = ((Int64)sp.OutputValues[2]);
有没有一种方法可以用第一种方法访问sproc的输出参数-从我的sproc调用返回SubSonic强类型集合? 谢谢。     
已邀请:
        我想做类似的事情,最终更改了大部分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);
    }
因此,基本上我传入了任何sproc参数,并为返回值定义了\'out \'参数。 此处也未显示,但是如果我有InOut参数,则将其传递
ref
而不是
out
。 然后在我的实际应用程序代码中,我可以像任何其他函数一样调用存储的proc:
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参数类型的列。 希望这会有所帮助     

要回复问题请先登录注册