4

私の Oracle データベースは次のエラーを返します。

ORA-12899 - 列 TIT.ESTADO_CIVIL の値が大きすぎます (実際: 2、最大: 1)

しかし、送信された値が一意の文字「C」であることは確かです。

なぜこれが起こっているのか誰にも分かりますか?

(私はODP.NETでC#を使用しています)

4

2 に答える 2

5

「C# char には 16 ビットがあります。Google で検索すると、Oracle CHAR 型は 8 ビットであることがわかります。」

これに対処するには、いくつかの方法があります。最善の解決策は、文字セマンティクスを使用するようにデータベースを修正することです。

alter system set nls_length_semantics = char
/ 

これには大きな影響があるため、問題が解決することを確認する必要があります。文字セマンティクスを使用するようにテーブルを変更し、ORA-12899 例外が削除されるかどうかを確認します。

SQL> create table t69 (col1 char(1 byte))
  2  /

Table created.

SQL> desc t69
 Name          Null?    Type
 ------------- -------- ----------------
 COL1                   CHAR(1)


SQL> alter table t69 modify col1 char(1 char)
  2  /

Table altered.

SQL> desc t69
 Name          Null?    Type
 ------------- -------- ----------------
 COL1                   CHAR(1 CHAR)

SQL>

ドキュメントには、グローバリゼーションと文字セットに関する多くの役立つ情報があります。使用しているデータベースのバージョンはわかりません。そのため、Length Semantics に関する 9i ドキュメントへのリンクを次に示します。

于 2010-05-02T15:27:48.220 に答える
0

データベースレベルでの修正は、受け入れられた回答によると、驚くべき動作を回避するため、最良のアイデアのようです。

ただし、データベース レベルで修正したくない (またはアクセスできない) 場合は、2 つの方法でこれを機能させることができました。2番目のものについてはよくわかりませんが、誰かが役に立った/説明できる場合に備えて共有したかった.

私の問題

  • Oracle ストアド プロシージャは、列char (1 byte)の値を設定するために使用されるtype の入力パラメータを受け取ります。char (1 byte)
  • 私は使用していますSystem.Data.OracleClient.OracleCommand

    IDbDataParameter parm = command.CreateParameter();
    parm.ParameterName = "myname";
    parm.ParameterValue = 'A'; // a C# (16 bit) char
    

これはvalue too large for column、元のポスターが言及しているエラーに該当します。

解決策 1

OracleType値を設定した後、手動でオーバーライドします。

((OracleParameter)parm).OracleType = OracleType.Char;

解決策 2

もう少し危険 - 文字列を使用するだけです (なぜこれが機能するのか理解できないので、それに頼るのは慎重になるでしょう):

parm.ParameterValue = "A"; // "A" instead of 'A'
于 2017-03-28T14:08:17.030 に答える