Здравствуйте, 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);
}