私の Oracle データベースは次のエラーを返します。
ORA-12899 - 列 TIT.ESTADO_CIVIL の値が大きすぎます (実際: 2、最大: 1)
しかし、送信された値が一意の文字「C」であることは確かです。
なぜこれが起こっているのか誰にも分かりますか?
(私はODP.NETでC#を使用しています)
「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 ドキュメントへのリンクを次に示します。
データベースレベルでの修正は、受け入れられた回答によると、驚くべき動作を回避するため、最良のアイデアのようです。
ただし、データベース レベルで修正したくない (またはアクセスできない) 場合は、2 つの方法でこれを機能させることができました。2番目のものについてはよくわかりませんが、誰かが役に立った/説明できる場合に備えて共有したかった.
私の問題
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'