У меня возникли проблемы с приложением, которое мы переносим на Mono.
(Для справки .NET. Время выполнения - 4.0, а моно версия - 2.6.7.)
РЕДАКТИРОВАТЬ: эта проблема сохраняется на Mono 2.10.2
Как часть запуска приложения, оно считывает данные в память. Для этой части я просто использую встроенные команды SQL, но по какой-то причине я вижу противоречивое поведение в Linux / Mono (когда все это работает в Windows / .NET).
У меня есть запрос, который отлично работает в некоторых сценариях, но не в других.
Этот конкретный пример не работает:
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
objectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("ID"));
objectToLoad.Property2 = reader.GetString(row.GetOrdinal("Name"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("NativeCurrencyID"));
}
РЕДАКТИРОВАТЬ: Для сравнения, вот тот, который работает :
var cmd = new SqlCommand("SELECT VATTerritoryID, ProductDescriptionID, VATBandID FROM VATTerritoryBandExceptions", conn);
var reader = cmd.ExecuteReader();
var someOtherObjectToLoad = new SomeOtherObjectType();
while (reader.Read())
{
someOtherObjectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
someOtherObjectToLoad.Property2 = reader.GetString(row.GetOrdinal("ProductDescriptionID"));
someOtherObjectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATBandID"));
}
У меня были возможные подозрения, что были различия до:
- Casing (поскольку я знаю, что в Windows / Linux это отличается), но перевод всего в нижний регистр не решил проблему
- Имена столбцов (возможно, Mono больше заботится о зарезервированных словах?), Но замена имени на [Name] или 'Name', кажется, не изменила
Ошибка, с которой я столкнулся в первом случае:
[IndexOutOfRangeException: Array index is out of range.]
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
Предполагается, что в возвращаемом наборе результатов нет "column1".
(РЕДАКТИРОВАТЬ: немного обновил этот раздел для ясности)
Странно, если я сделаю это:
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
Console.WriteLine("First row, first column is " + row.GetValue(0));
Console.WriteLine("First row, second column is " + row.GetValue(1));
Console.WriteLine("First row, third column is " + row.GetValue(2));
Console.WriteLine("First row, fourth column is " + row.GetValue(3));
}
Вывод:
First row, first column is 0
First row, second column is New
Array index is out of range.
Я предполагаю, что в этом случае со средой Mono происходит нечто странное, но я не могу найти соответствующий отчет об ошибке и не могу понять, почему это происходит только в некоторых случаях, а не в других! У кого-нибудь еще был подобный опыт?
РЕДАКТИРОВАТЬ: я изменил некоторые операторы, чтобы точно соответствовать тем, которые в ошибочном запросе , в случае, если есть проблема с зарезервированными словами или подобными. Обратите внимание, что запрос, который я выполняю во втором случае, действительно запрашивает четыре столбца и, по-видимому, возвращает только два очень нечетных (0 | New).