Некоторые простые запросы не выполняются при использовании SACommand
от поставщика данных Sap.Data.SQLAnywhere.v4.5.(Таким образом, подключение к базе данных SAP SQL Anywhere 17.)
Это как если бы поставщик данных неправильно извлекал тип столбца набора результатов, а затем пытался выполнить недопустимое приведение.
Примером
using (var cmd = new SACommand(@"select 'Test' + :p", cnx))
{
cmd.Parameters.AddWithValue(":p", " Test");
using (var reader = cmd.ExecuteReader())
...
}
ExecuteReader
не удается с SAException : Cannot convert 'Test Test' to numeric
.
using (var cmd = new SACommand(@"select case when 0 = 1 then :p1 else :p2 end", cnx))
{
cmd.Parameters.AddWithValue(":p1", "odd");
cmd.Parameters.AddWithValue(":p2", "normal");
using (var reader = cmd.ExecuteReader())
...
}
ExecuteReader
не удается с SAException : Cannot convert 'normal' to integer
.
using (var cmd = new SACommand(@"select d.HighScale + :p from DecimalTable d", cnx))
{
cmd.Parameters.AddWithValue(":p", _decimalTestValue);
using (var reader = cmd.ExecuteReader())
{
Assert.That(reader.Read(), Is.True, "No row returned");
object value = null;
Assert.That(() => value = reader.GetValue(0), Throws.Nothing, "Failed reading value");
Assert.That(value, Is.TypeOf<decimal>().And.EqualTo(_decimalTestValue * 2m),
"Unexpected value read");
}
}
Этот сбой из-зачтобы получить double
вместо decimal
, потеряв при этом несколько цифр.
При отладке внутри провайдера данных возникает ошибка, происходящая из SADataReader
, Init
метод извлекает соответственно тип столбца numeric
вместо varchar
, тип столбца integer
вместо varchar
и тип столбца double
вместо decimal
.
Затем он не может прочитатьстрока, или вызывает потерю точности в последнем случае.
Вот полный gist .
Эта проблема не возникает, когда просто чтение столбца таблицы без каких-либорасчет по примеру.Я не могу воспроизвести его ни с помощью Interactive SQL, ни с помощью локальных переменных (для эмуляции параметров).
Пока что я нашел единственный обходной путь - добавить явное приведение либо вокруг всего выражения, либо вокруг параметров.Но это довольно неудобно, особенно когда вы на самом деле не кодируете SQL, а вместо этого используете какой-либо провайдер Linq.
Эти тесты происходят из набора тестов ORM и успешно выполняются во многих других базах данных (Ms SQL Server, Oracle, PostgreSQL, MySQL, SQLite, ...).(У Firebird похожая проблема, и у ORM уже есть грязный хак для внедрения бросков в SQL на лету, в случае Firebird. Я бы не стал копировать это.)
Есть ли какие-либо настройки для настройкив этом поставщике данных для лучшего вывода типа столбца для наборов результатов?
Я нашел этот другой вопрос , который выглядит как та же проблема с еще одним случаем запроса, но с довольностарая версия базы данных.К сожалению, он не дал полезного ответа.
Я также спрашивал об этом на сайте SAP , пока нет ответов.