Проблема с Oracle NUMBER: приведение к десятичной дроби в Int64 - PullRequest
2 голосов
/ 22 июля 2009

Мы разрабатываем отдельное приложение, которое хранит свои данные в базе данных. Мы используем набор данных и TableAdapters для связи с базой данных. Одним из основных требований является приложение, чтобы иметь возможность использовать SQL Server, Oracle и MySQL. Для этого мы сделали запросы к поставщику ТП независимыми. Мы используем ODBC провайдера.

Отлично работает для SQL Server и MySQL, но с Oracle у нас были проблемы. Одной из проблем, которую мы не можем преодолеть, является ошибка приведения десятичного числа к Int64.

Таблицы Oracle используют NUMBER (38) для системных идентификаторов (полей автоинкремента), которые, как кажется, отображаются в десятичном виде. Однако мы используем Int64 / long в DataSet / TA, поскольку SQL Server и MySQL используют BIGINT. (Обратите внимание, что DataSEt TableAdapters, где автоматически генерируются из схемы SQL Server в начале.)

Мы получаем исключение приведения при получении значения NUMBER от Oracle, поскольку оно возвращает десятичный объект.

DbCommand getIDcmd = connection.CreateCommand();
getIDcmd.CommandText = "select LAST_ID from SEQUENCE_ID";
sequenceID = (Int64)getIDcmd.ExecuteScalar(); // we get a cast exception here returns decimal 

обратите внимание, что мы попытались снизить точность в Oracle (например, NUMBER (10)), как мы видели в других записях на форуме, но безуспешно.

Это проблема ODBC? Если мы перейдем к другому провайдеру, то решим проблему?

Ответы [ 3 ]

1 голос
/ 22 июля 2009

Вы можете запустить это, чтобы узнать, какой тип на самом деле возвращается, а затем перейти оттуда:

System.Windows.Forms.MessageBox.Show(getIDcmd.ExecuteScalar().GetType().ToString());
1 голос
/ 22 июля 2009

Кажется, что этот запрос всегда будет возвращать "десятичное число". Вы можете попробовать это:

sequenceID = Convert.ToInt64(getIDcmd.ExecuteScalar());

Я не думаю, что в вашем случае произойдет потеря точности.

Обратите внимание, что снижение точности вашего NUMBER - это всегда хорошая идея: Int64 отображается на NUMBER(19). Это не решит вашу проблему под рукой, но может предотвратить больше проблем в будущем. Например, если вы получите IDataRecord, включая ваш идентификатор (с использованием поставщика Microsoft Oracle), вызов GetInt64 завершится неудачно, если ваш столбец определен как NUMBER(38) и преуспевает, когда определено как NUMBER(19) (даже когда значение находится в правильном диапазоне).

1 голос
/ 22 июля 2009

Если sequence_id - это имя вашей последовательности, ваш запрос выглядит неправильно в Oracle. Вы бы запросили последний заданный идентификатор с помощью запроса:

SELECT last_number FROM all_sequences WHERE sequence_owner=? AND sequence_name=?

Приведение не должно быть проблемой (если находится в диапазоне int64).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...