Указание каких полей не хватает при вызове хранимых процедур
От: lonli Беларусь  
Дата: 21.04.11 08:44
Оценка:
Есть проблемка-пожелание новой фичи.

При вызове хранимой процедуры с параметрами в виде строк

public DbManager SetSpCommand(string spName, params object[] parameterValues)


если у процедуры не совпадает число параметров и посылаемыми — кидается ексепшен с текстом Parameter count does not match Parameter Value count.
Происходит это в методе

private void AssignParameterValues(IEnumerable<IDbDataParameter> commandParameters, object[] parameterValues)


Вопрос — можно ли допилить этот метод чтобы он указывал в тексте, каких полей не хватает для вызова или какие поля лишние?
Re: Указание каких полей не хватает при вызове хранимых проц
От: IT Россия linq2db.com
Дата: 21.04.11 10:36
Оценка:
Здравствуйте, lonli, Вы писали:

L>
L>public DbManager SetSpCommand(string spName, params object[] parameterValues)
L>


L>Вопрос — можно ли допилить этот метод чтобы он указывал в тексте, каких полей не хватает для вызова или какие поля лишние?


Т.к. этому методу передаются параметры как значения, то всё, что он может сделать — это проверить количество параметров сохранённой процедуры на совпадение с количеством передаваемых значений.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Указание каких полей не хватает при вызове хранимых п
От: lonli Беларусь  
Дата: 21.04.11 11:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>Т.к. этому методу передаются параметры как значения, то всё, что он может сделать — это проверить количество параметров сохранённой процедуры на совпадение с количеством передаваемых значений.


я понимаю, но хочется сразу видеть хотя бы каким полям не хватило значений и какие значения были лишние, часто такое ведь пишется в лог и полезно в первую очередь сапорту.


        /// <summary>
        /// This method assigns an array of values to an array of parameters.
        /// </summary>
        /// <param name="commandParameters">array of IDbDataParameters to be assigned values</param>
        /// <param name="parameterValues">array of objects holding the values to be assigned</param>
        private void AssignParameterValues(IDbDataParameter[] commandParameters, object[] parameterValues)
        {
            if (commandParameters == null || parameterValues == null)
            {
                // Do nothing if we get no data.
                //
                return;
            }

            var nValues = 0;

            // Iterate through the parameters, assigning the values from 
            // the corresponding position in the value array.
            //
            for (int index = 0; index < commandParameters.Length; index++)
            {
                var parameter = commandParameters[index];
                if (_dataProvider.IsValueParameter(parameter))
                {
                    if (nValues >= parameterValues.Length)
                    {
                        throw new ArgumentException(GetMissedColumnNames(index, commandParameters));
                    }

                    var value = parameterValues[nValues++];

                    _dataProvider.SetParameterValue(parameter, value ?? DBNull.Value);
                }
            }

            // We must have the same number of values as we pave parameters to put them in.
            //
            if (nValues != parameterValues.Length)
                throw new ArgumentException(GetExceedParameters(nValues, parameterValues));
        }

        private string GetMissedColumnNames(int startIndex, IDbDataParameter[] commandParameters)
        {
            var columnNames = new List<string>();
            for (int index = startIndex; index < commandParameters.Length; index++)
            {
                var parameter = commandParameters[index];
                if (_dataProvider.IsValueParameter(parameter))
                {
                    columnNames.Add(string.Format("{0} {{{1}}}", parameter.ParameterName, parameter.DbType));
                }
            }

            return "Missed columns: " + string.Join(", ", columnNames);
        }

        private static string GetExceedParameters(int startIndex, object[] parameterValues)
        {
            var columnNames = new List<string>();
            for (int index = startIndex; index < parameterValues.Length; index++)
            {
                var parameter = parameterValues[index];
                columnNames.Add(string.Format("{0} {{{1}}}", parameter, parameter.GetType().Name));
            }

            return "Exceed parameters: " + string.Join(", ", columnNames);
        }
Re[3]: Указание каких полей не хватает при вызове хранимых п
От: lonli Беларусь  
Дата: 21.04.11 11:46
Оценка:
Здравствуйте, lonli, Вы писали:

L>Здравствуйте, IT, Вы писали:


IT>>Т.к. этому методу передаются параметры как значения, то всё, что он может сделать — это проверить количество параметров сохранённой процедуры на совпадение с количеством передаваемых значений.


L>я понимаю, но хочется сразу видеть хотя бы каким полям не хватило значений и какие значения были лишние, часто такое ведь пишется в лог и полезно в первую очередь сапорту.


И имя процедуры в этом сообщении тоже весьма и весьма полезно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.