Транспорт с большой точностью перемещается из Oracle в SQL Server через .Net и SqlBulkCopy. - PullRequest
0 голосов
/ 28 апреля 2019

Работая с 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), которую я описал?

1 Ответ

1 голос
/ 28 апреля 2019

Из всех использованных тэгов я немного знаю Oracle. Возможно, вам не хватает маски формата с функцией TO_CHAR. Вот пример:

SQL> create table the_table (the_float number);

Table created.

SQL> insert into the_table values (-0.00000000000000088817841970012);

1 row created.

SQL>
SQL> select to_char(the_float) your_result,
  2         to_char(the_float, '0D9999999999999999999999999999999999') my_result
  3  From the_table;

YOUR_RESULT                              MY_RESULT
---------------------------------------- -------------------------------------
-,00000000000000088817841970012          -0,0000000000000008881784197001200000

SQL>

Посмотрите, поможет ли это (надеюсь, это поможет).

Подробнее о моделях формата здесь: https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Format-Models.html#GUID-EAB212CF-C525-4ED8-9D3F-C76D08EEBC7A

...