Параметры кэширования корпоративной библиотеки на сохраненных процессах? - PullRequest
3 голосов
/ 01 апреля 2009

Я пытаюсь стандартизировать некоторый код доступа к данным с моими коллегами. Один из вышеупомянутых коллег утверждает, что Блок доступа к данным 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

Ответы [ 2 ]

3 голосов
/ 22 апреля 2009

Это определенно раньше, я разорвал код и бросил в мою библиотеку.

он использовал sp_help и проанализировал выходные данные, чтобы определить типы данных.

В наши дни я разорвал код, .Net намного лучше насчет добавления параметров.

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

в вашем примере вы продолжаете отражать ... вы обнаружите, что это делается по этому пути GetStoredProcCommand ()

Вы получите объект Command обратно, уже заполненный параметрами

Код ent lib защищен авторским правом, но код почти идентичен этому

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

2 голосов
/ 21 августа 2009

Насколько я могу судить, он не кэширует параметры. Используя один и тот же экземпляр объекта Database, я несколько раз вызывал DiscoverParameters во время выполнения трассировки. Каждый раз, когда я вызываю DiscoverParameters, я вижу [sys]. [Sp_procedure_params_100_managed], так что похоже, что он совершает круговую поездку каждый раз.

Вот пример того, как сделать это самостоятельно, кажется, что все в порядке:

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

...