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);
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.