Поставщик данных Oracle .NET и приведение типов

Я использую конкретного поставщика данных Oracle (11g), а не поставщика Microsoft, поддержка которого прекращается. Что я обнаружил в ODP.NET, так это то, насколько он разборчив с типами данных. Если JDBC и другие поставщики ADO просто конвертируют и заставляют все работать, ODP.NET выдаст недопустимое исключение приведения, если вы не сделаете это правильно.

Рассмотрим этот код:

        String strSQL = "SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL";

        OracleCommand cmd = new OracleCommand(strSQL, conn);
        reader = cmd.ExecuteReader();
        if (reader != null && reader.Read()) {
           Int64 id = reader.GetInt64(0);
           return id;
        }

Из-за придирчивости ODP.NET к конвертации это не работает. Мои обычные варианты:

1) Получить в Decimal и вернуть его с приведением к Int64 (мне это не нравится, потому что Decimal просто излишне, и, по крайней мере, однажды я помню, что читал, что он устарел ...)

Decimal id = reader.GetDecimal(0);
return (Int64)id;

2) Или введите оператор SQL, чтобы убедиться, что он подходит для Int64, например NUMBER (18)

String strSQL = "SELECT CAST(DOCUMENT_SEQ.NEXTVAL AS NUMBER(18)) FROM DUAL";

Я делаю (2), потому что считаю, что это не совсем чисто, если вывести число в .NET Decimal, когда мои типы домена - Int32 или Int64. Другие провайдеры, которые я использовал, достаточно хороши (умны), чтобы выполнять преобразование на лету.

Есть предложения от гуру ODP.NET?


person codenheim    schedule 23.03.2010    source источник
comment
В ODP.NET все числовые типы будут преобразованы в десятичные. Затем вы должны быть приведены к соответствующему типу, например Int64 (длинный), Int16 (короткий) и т. Д. Может быть полезна любая таблица о типе NUMBER (n, p) в ORACLE и лучшем типе .NET.   -  person Kiquenet    schedule 11.11.2014


Ответы (1)


Это будет работать с вашим исходным SQL:

Int64 id = System.Convert.ToInt64(reader.GetValue(0));
person Igby Largeman    schedule 24.03.2010