Вызываю хранимку, в результате 7 столбцов — два последних типа decimal (назовём их A и Б). SqlDataReader считывает их некорректно — значение последнего столбца равно сумме A и Б. Ну то есть, если в БД A=1 и Б=2, то вызов dataReader.GetDecimal(dataReader.GetOrdinal("Б")) даёт 3! Как такое вообще может быть? Иногда такое же происходит и со столбцом A, значения тоже как-то портятся (пока не понял как именно). Остальные столбцы считываются нормально.
ASP.NET MVC 4, .NET 4.5.1, Sql Server 2008 R2 (отдельный сервер)
Вызов через SSMS:
2 2 32 NULL NULL 85.9789 94.1638
2 2 73 NULL NULL 98.6300 94.2306
2 2 81 NULL NULL 99.6151 99.6309
2 2 84 NULL NULL 7.2424 7.4693
А вот что выдаёт SqlDataReader:
2, 2, 32, , , 85,9789, 180,1427
2, 2, 73, , , 98,6300, 192,8606
2, 2, 81, , , 99,6151, 199,2460
2, 2, 84, , , 7,2424, 14,7117
Ну вот что это, куда копать?
Код вызова предельно прост.
| Скрытый текст |
| internal static ICollection<T> ExecuteProcedure<T>(
this IDbConnection connection,
string procedure, object parameters,
Func<IDataRecord, T> factory)
{
using (var command = connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = procedure;
TryAddParameters(command, parameters); // заполняет command.Parameters
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
if (log.Switch.ShouldTrace(TraceEventType.Information))
{
TraceCommand(command);
}
using (var dataReader = command.ExecuteReader(CommandBehavior.SingleResult))
{
var items = new List<T>();
while (dataReader.Read())
{
if (log.Switch.ShouldTrace(TraceEventType.Verbose))
{
var values = new object[dataReader.FieldCount];
dataReader.GetValues(values);
log.TraceData(TraceEventType.Verbose, 1, values); // вот тут уже видно некорректные значения
}
items.Add(factory(dataReader)); // factory делает из IDataRecord объект, значения к этому моменту уже испорчены
}
return items.ToArray();
}
}
}
|
| |