存储过程中的企业库缓存参数?

时间:2009-04-01 09:39:20

标签: c# stored-procedures data-access-layer enterprise-library

我正在尝试与同事一起标准化一些数据访问代码。上述同事之一声称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

2 个答案:

答案 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