我已经使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或其他库来从数据库中获取长度?
答案 0 :(得分:3)
如果您使用的是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参数,但是将代码调整为输出参数应该很简单。
答案 1 :(得分:1)
存储过程中的输出参数具有数据类型/大小。用那个。
如果你的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"];
}
答案 2 :(得分:0)
您必须查看SQL代码。或反映(和缓存)
编辑:这里有一些技巧