Oracle .NET Data Provider и приведение - PullRequest
3 голосов
/ 24 марта 2010

Я использую определенный поставщик данных 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) Извлечь в десятичное число и вернуть его с приведением к Int64 (мне это не нравится, потому что десятичное просто излишне, и, по крайней мере, однажды я помню, что чтение устарело…)

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, когда мои типы доменов Int32 или Int64. Другие провайдеры, которых я использовал, достаточно хороши (умны) для конвертации на лету.

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

1 Ответ

3 голосов
/ 24 марта 2010

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

Int64 id = System.Convert.ToInt64(reader.GetValue(0));
...