Столбец Oracle / Размер значения Проблема - PullRequest
4 голосов
/ 02 марта 2011

Я использую ODP.NET и Oracle 10g для передачи данных из таблицы данных в таблицу базы данных. Проблема, с которой я сталкиваюсь, заключается в попытке вставить значение в столбец NUMBER (12,3). Значение 100100100,55 - я получаю ошибку: Ошибка в строке «1», столбец «6» ORA-26093: размер столбца входных данных (24) превышает максимальный размер ввода (22)

Но если я попробую 100100100,5, все будет хорошо

Это сообщение об ошибке не имеет для меня значения.

Может кто-нибудь объяснить мне, почему? Спасибо!

Также вот фрагмент кода, который выдает эту ошибку:

        OracleBulkCopy bc = new OracleBulkCopy(DBFacade.DbConnection);
        DataTable dt = new DataTable();
        dt.Columns.Add();
        dt.Rows.Add(100100100.11);
        bc.DestinationTableName = "tmp_import_bom";
        bc.ColumnMappings.Add(0, "QTY");
        bc.WriteToServer(dt);

Ответы [ 4 ]

3 голосов
/ 22 января 2013

Когда вы создаете столбец DataTable, подобный этому в вашем примере кода, dt.Columns.Add(), он по умолчанию набирает строку .

У меня была похожая проблема, и я обнаружил, что проблема в том, что массовая копия oracle не может обработать преобразование строк в десятичную или длинную, если длина строки превышает 11 .

Чтобы обойти это, вам нужно убедиться, что исходный тип данных является десятичным или длинным, а не строкой. В вашем примере кода вы можете сделать это с помощью dt.Columns.Add("QTY", typeof(decimal));

Подробности:

Из того, что я понял, сообщение об ошибке фактически говорит нам, что максимальная длина строки для такого преобразования равна 11. Эти (24) и (22) ссылки в сообщении являются длинами строки ввода и максимально допустимым x 2. Моя строка была 26641778.595, длина которой 12, включая десятичную точку. Если я добавил цифру, сообщение изменилось на (26) и т. Д. Снова, у меня также была та же проблема с простым старым числом, таким как 123456789012, который имеет длину 12.

1 голос
/ 27 июля 2015

Ответ на этот вопрос содержится в документе Oracle «OracleBulkCopy выбрасывает ORA-26093 при вставке в столбец NUMBER с точностью (идентификатор документа 1382276.1)».

Вкратце:

ПРИЧИНА:Это по замыслу и ожидаемому поведению.Тип по умолчанию: System.String.

РЕШЕНИЕ: укажите тип данных столбца

Поэтому вместо:

dt.Columns.Add();

следует написать:

DataColumn dc = new DataColumn();
dc.DataType = Type.GetType("System.Double");
dc.ColumnName = "QTY";
dt.Columns.Add(dc);
1 голос
/ 02 марта 2011

A NUMBER(12,3) должно содержать значения, которые вы пытаетесь без проблем.И если вы превышаете точность числового столбца, скорее всего, ошибка, которую вы получите, будет ORA-01438: value larger than specified precision allowed for this column.

Похоже, ошибка может быть связана с другим столбцом в таблице.Похоже, вы указываете только один столбец на вставке, но ошибка ссылается на column '6'.Какие еще столбцы в таблице?

0 голосов
/ 02 марта 2011

Эта ошибка обычно возникает из-за несоответствия метаданных, а не из-за ошибки значения. Убедитесь, что тип данных, который вы используете на стороне .Net, соответствует спецификации столбца с номером (12,3) на стороне ORacle. Попробуйте передать его как «double» (преобразование в приложение double) и посмотрите, решит ли это проблему.

...