Работая с ODP.Net, я подключаюсь к базе данных Oracle и передаю данные на SQL Server с помощью SqlBulkCopy.
Как большинство из нас уже заметили - Oracle float может хранить значения с точностью выше, чем переменные .Netдержать..Net может хранить точность до 28, а Oracle может иметь, например, 30. В этом случае ODP.Net выдает сообщение «Указанное преобразование недопустимо».
Oracle не будет корректировать свой код, а Microsoft не будетсоздайте новую переменную с более высокой точностью, что заставляет нас делать обходные пути.
В моем случае я не мог найти другой путь, кроме как преобразовать плавающие значения Oracle в nvarchar и затем сохранить их во временной таблице SQL Server, котораяимеет тип nvarchar и затем с хранимой процедурой для преобразования этого nvarchar в SQL Server с плавающей точкой.Таким образом, я могу сохранить исходное значение и не потерять часть его точности.
ORACLE: Для SqlBulkCopy я использую этот sql для получения данных из Oracle:
SELECT TO_CHAR(the_float) FROM the_table;
bulkCopy.WriteToServer(reader);
Затем наSQL Server Я вижу значение следующим образом:
-,00000000000000088817841970012
Это форматирование по умолчанию, которое использует Oracle (пропущен начальный 0).
Преобразование этого с использованием T-SQL
SELECT Try_convert(float,'-,00000000000000088817841970012') FloatValue
(Мне пришлось заменить, на. Чтобы мой SQL Server распознал его как float, и преобразование работает!)
Try_convert(float,REPLACE('-,00000000000000088817841970012', ',', '.')) FloatValue
Это способ обхода Oracle Float иНесовместимость переменных .Net (ODP.Net и .Net), которую я описал?