【问题标题】:How to determine size property for stored procedure output parameters in C# data access layer如何确定 C# 数据访问层中存储过程输出参数的大小属性
【发布时间】:2010-01-06 04:22:19
【问题描述】:

我已经根据 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 或其他库从数据库中获取长度?

【问题讨论】:

  • 当然,您可以获得列的长度,但这并不能告诉您访问表的存储过程将带回什么。 SP 可以从一个或二十个表中获取列信息,将它们连接起来,截断它们,或者替换它自己的值。没有办法根据表格来预测这一点。你必须知道 SP 发回了什么。

标签: c# sql-server stored-procedures ado.net parameters


【解决方案1】:

如果您使用 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)。

我在generating SP access for C# 的博客上写道。 OUT 参数我这里没有讲,但是调整代码输出参数应该很简单。

【讨论】:

  • 太酷了!我一读到这,就拍了拍我的额头。我用过 sys.以前的东西,但我从来没有想过这可以与SP一起使用。光滑,@devio!
【解决方案2】:

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

如果你的 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"];

}

【讨论】:

  • 这是一个通用的 DAL,我不知道要调用什么 SP。我将更新我的问题以使其更加明显。
【解决方案3】:

您必须查看 SQL 代码。或者反射(和缓存)

编辑:这里突出显示了一些技术

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多