Неправильный вывод типа с поставщиком данных Sap.Data.SQLAnywhere - PullRequest
0 голосов
/ 28 сентября 2018

Некоторые простые запросы не выполняются при использовании 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 , пока нет ответов.

...