4

ODP.NET と Oracle 10g を使用して、データ テーブルから db テーブルにデータを転送しています。私が直面している問題は、値を 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

4 に答える 4

3

コード例でそのような DataTable 列を作成すると、dt.Columns.Add()デフォルトで string 型になります。

同様の問題があり、問題は、文字列の長さが 11 を超えると、Oracle 一括コピーが文字列を 10 進数または long に変換できないことです。

回避するには、ソース データ型が文字列ではなく、10 進数または long であることを確認する必要があります。dt.Columns.Add("QTY", typeof(decimal))サンプルコードでは、 ;でそれを行うことができます。

詳細:

私が収集したものから、エラー メッセージは実際には、このような変換の最大文字列長が 11 であることを示しています。メッセージ内のこれらの (24) および (22) 参照は、入力の文字列長であり、最大許容 x 2 です。入ってくる文字列は 26641778.595 で、これは小数点を含めて長さ 12 です。数字を追加すると、メッセージは (26) などに変わりました。ここでも、長さ 12 の 123456789012 のような単純な古い番号でも同じ問題が発生しました。

于 2013-01-22T18:16:42.213 に答える
1

ANUMBER(12,3)は、問題なく試している値を保持する必要があります。また、数値列の精度を超えていた場合、エラーが発生する可能性が高くなりますORA-01438: value larger than specified precision allowed for this column

エラーが表の別の列に関連している可能性があるようです。挿入で 1 つの列のみを指定しているように見えますが、エラーはcolumn '6'. 表の他の列は何ですか?

于 2011-03-02T14:40:59.167 に答える
1

この質問は、Oracle ドキュメント「OracleBulkCopy で NUMBER 列に挿入すると ORA-26093 がスローされる (ドキュメント ID 1382276.1)」で回答されています。

要するに:

原因: これは仕様によるものであり、予期される動作です。デフォルトの型は System.String です。

解決策: 列のデータ型を指定する

したがって、代わりに:

dt.Columns.Add();

次のように書く必要があります。

DataColumn dc = new DataColumn();
dc.DataType = Type.GetType("System.Double");
dc.ColumnName = "QTY";
dt.Columns.Add(dc);
于 2015-07-27T15:24:07.063 に答える
0

このエラーは通常、値のエラーではなく、メタデータの不一致が原因です。.Net 側で使用しているデータ型が、ORAcle 側の number(12,3) 列の仕様と一致していることを確認してください。'double' (アプリケーションで double に変換) として渡してみて、問題が解決するかどうかを確認してください。

于 2011-03-02T17:29:49.223 に答える