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

我已经使Castle Project的ActiveRecord实现无耻地建模数据访问层。 为了使它获得认可,它必须支持在我的组织中使用的大量存储过程库,这些库已被编写为使用可以想象的每个输入/输出结构,包括每种可能的数据类型的返回值和输出参数。

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

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

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

[StoredProcedure("usp_PostARTransaction", OperationType.Insert)] public class ARTranPost : DataObjectBase { [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 ) 

你知道输出parm是什么。 叫它

 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代码。 或反映(和缓存)

编辑:这里有一些技巧

  • 为存储过程自动生成包装类第1 部分 , 第2部分
  • 使用.NET元数据和reflection将数据层动态绑定到存储过程和SQL命令