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