繁体   English   中英

如何在C#数据访问层中确定存储过程输出参数的大小属性

[英]How to determine size property for stored procedure output parameters in C# data access layer

我已经制作了一个数据访问层,该层基于Castle Project的ActiveRecord实现进行了无耻的建模。 为了使其获得认可,它必须支持本组织正在使用的广泛的存储过程库,这些存储过程已编写成使用可以想象的每种输入/输出结构,包括每种可能的数据类型的返回值和输出参数。

我的问题是在开发将输出参数添加到用于执行存储过程的Command对象的参数集合的代码中。 现在,我只是使用一个较大的默认值,希望它足以应付所有情况,但这感觉很伪劣。

我如何提前知道输出参数的长度?

这是我的DAL类,使用属性来表示输出参数:

 [StoredProcedure("usp_PostARTransaction", OperationType.Insert)]
    public class ARTranPost : DataObjectBase<ARTranPost>
    {
        [StoredProcedureParameter("sARTranID",OperationType.Insert,ParameterDirection.Output)]
        public string ARTranID {get;set;}
        [StoredProcedureParameter("sDueDate", OperationType.Insert, ParameterDirection.Input)]
        public string DueDate { get; set; }
        [StoredProcedureParameter("sPostDate", OperationType.Insert, ParameterDirection.Input)]
        public string PostDate { get; set; }

    }

我是否需要使用SMO或其他库从数据库中获取长度?

如果使用SQL Server(在OP中未指定),则可以使用sysobjects和syscolumns目录视图检索存储过程及其参数:

SELECT p.name, t.name, c.*
FROM sysobjects p
INNER JOIN syscolumns c ON p.id = c.id
INNER JOIN systypes t on c.xusertype = t.xusertype
WHERE p.type = 'P'
AND p.name NOT LIKE 'dt[_]%'
ORDER BY p.name, c.colid

(在SQL2005 +中,使用sys.objects,sys.types和sys.columns,但较旧的视图仍然存在)

这将为您提供SP名称,类型名称,参数名称,长度和输入/输出方向(c.isoutparam)。

我在博客上写了有关为C#生成SP访问的信息 我没有在这里介绍OUT参数,但是将代码调整为输出参数应该很简单。

您的存储过程中的输出参数具有数据类型/大小。 用那个

如果您的SP像:

create procedure DoThis
    @parm1 int
    , @parm2 varchar(50) output
as

select @parm2 = (
select breed from dogs
where dogid = @parm1
)

您知道什么是输出参数。 称它为

public string DoThis(int dogid)
{
    SqlCommand cmd = new SqlCommand("DoThis");
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = theConnection;

    cmd.Parameters.Add(new SqlParameter("@parm1", dogid);
    cmd.Parameters["@parm1"].DbType = DbType.Int32;

    cmd.Parameters.Add(new SqlParameter("@parm2", DbType.String, 50));
    cmd.Parameters["@parm2"].Direction = ParameterDirection.Output;

    db.ExecuteNonQuery(cmd);

    return (string) cmd.Parameters["@parm2"];

}

您必须查看SQL代码。 或反映(并缓存)

编辑:这里有突出显示的技术

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM