3

我正在尝试与我的同事标准化一些数据访问代码。上述一位同事断言 EntLib 数据访问块试图缓存存储过程调用上的参数。

我看过反射器,有一些证据表明它可能正在缓存它们。但我认为在以下情况下不会。

    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

4

2 回答 2

3

它确实习惯了,我把代码撕掉并扔进了我的图书馆。

它使用sp_help并解析输出以确定数据类型。

这些天,我撕掉了代码,.Net 在添加参数方面要好得多。

cmd.Parameters.AddWithValue("@name",somevalue)

在你的例子中,你一直在反射......你会发现它是沿着这条路径完成的 GetStoredProcCommand()

您将得到一个 Command 对象,该对象已经填充了参数

ent lib代码是有版权的,但是代码和这个几乎一模一样

http://code.google.com/p/dbdotnet/source/browse/trunk/ParameterCache.cs

于 2009-04-22T13:50:17.163 回答
2

据我所知,它不会缓存参数。使用相同的数据库对象实例,我在运行跟踪时多次调用 DiscoverParameters。每次我调用 DiscoverParameters 时,我都可以看到 [sys].[sp_procedure_params_100_managed],所以看起来它每次都在进行往返。

这是一个如何自己做的例子,看起来可能没问题:

http://davidhayden.com/blog/dave/archive/2006/11/03/CachingStoredProcedureParameters.aspx

于 2009-08-21T15:13:30.387 回答