Я использую определенный поставщик данных 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?