我正在尝试与同事一起标准化一些数据访问代码。上述同事之一声称EntLib数据访问块试图在存储的proc调用上缓存参数。
我看过反射器,有一些证据表明它可以缓存它们。但我不会认为它会在以下情况下发生。
public Dictionary<long, string> GetQueue(int maxItems)
{
var sq = new SqlDatabase(_connString.ConnectionString);
var result = new Dictionary<long, string>();
using (var cmd = (SqlCommand)sq.GetStoredProcCommand("dbo.GetQueue"))
{
sq.AddInParameter(cmd, "maxItems", DbType.Int32, maxItems);
var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
long id = reader.GetInt64(reader.GetOrdinal("id"));
string fileName = reader.GetString(reader.GetOrdinal("meta_data_filename"));
result.Add(id, fileName);
}
}
return result;
}
有人可以确认或否认吗?
我正在使用EntLib 4.1
答案 0 :(得分:3)
它绝对习惯了,我把代码撕掉了,扔进了我的库。
它使用sp_help
并解析输出以确定数据类型。
这些天,我把代码撕掉了,.Net在添加参数方面要好得多。
cmd.Parameters.AddWithValue("@name",somevalue)
在你的例子中你保持反思...你会发现它在这条路径下完成GetStoredProcCommand()
您将获得一个已经填充参数的Command对象
ent lib代码受版权保护,但代码几乎与此相同
http://code.google.com/p/dbdotnet/source/browse/trunk/ParameterCache.cs
答案 1 :(得分:2)
据我所知,它不会缓存参数。使用相同的Database对象实例,我在运行跟踪时多次调用DiscoverParameters。每次我调用DiscoverParameters时,我都可以看到[sys]。[sp_procedure_params_100_managed]所以看起来每次都要进行往返。
这是一个如何自己做的例子,似乎可能没问题:
http://davidhayden.com/blog/dave/archive/2006/11/03/CachingStoredProcedureParameters.aspx