- PR -

CLOB型が更新できません

1
投稿者投稿内容
会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2005-09-23 20:13
お世話になっております。
どうしてもわからないことがあるので質問させてください。

環境は以下の通りです。
Windows XP SP2
Visual Studio .NET 2003 C#
.NET FrameWork 1.1
oracle 10i

CLOB型フィールドの更新で、次のエラーが出ます。
「ORA-01461: can bind a LONG value only for insert into a LONG column 」
他の型や、CLOB型でも2000文字以内ではエラーが出ません。
更新のプログラムはこんな感じです。

OracleConnection con = new OracleConnection(CONSTRING);
OracleCommand command = new OracleCommand(SQL,con);
command.Parameters.Add("HTML",OracleType.Clob).Value = "ながーーい文字列";
con.Open();
command.ExecuteNonQuery();

ネット等で調べたのですが、原因がわかりませんでした。
同様の状況の経験のある方、ご教授願えないでしょうか。
よろしくお願いします。
aacute
常連さん
会議室デビュー日: 2005/08/25
投稿数: 30
投稿日時: 2005-09-24 00:10
ORA-01461: can bind a LONG value only for insert into a LONG column の検索結果のうち 日本語のページの中の以下の2つを見ての判断ですが。
解決済みの問題
OKWeb AccessからOrcleのODBCリンクテーブルへの挿入

CLOB列の文字コードが Unicode でないせいでは?
パラメータにセットするときに文字コードを変換してやるといいのかもしれません。
System.String は Unicode なので。

Oracleを使ったことはないので、特に自信はありませんが。
会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2005-09-26 11:48
aacuteさん 返信ありがとうございます。

参考のURLでは、varchar2(4000)型に4000バイト書き込みという感じですが、
私の場合CLOB型なので、4000バイト以上でも余裕で入るかと思います。
DBのキャラクタセットもUTF-8でした。
念のためテストで半角4000文字以上の書き込みをしたところ、
書き込めてしまいました。。。
aacuteのアドバイス通り、文字コード関連があやしそうです。
もう少し調べてみます。
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2005-12-15 17:28
「た」さん、この問題は解決できましたでしょうか?
もし、解決してましたら、解決方法を教えてください。
私も同じ事象で困っています。

とりあえず、強引な方法で逃げています。

「た」さんのコードでは、

command.Parameters.Add("HTML",OracleType.Clob).Value = "ながーーい文字列";

となっていますが、これを

command.Parameters.Add("HTML",OracleType.LongVarChar).Value = "ながーーい文字列";

と、LongVarChar型にしてみたら、
なぜか受け付けてくれました。
(データベース内のテーブルは、CLOBのままです。)

一応動いていそうですが、明らかに正しい対処法ではないと思いますので、
もし、他の方法で解決していたらぜひ教えて下さい。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 17:50
引用:

ビジネスモール開発者さんの書き込み (2005-12-15 17:28) より:

と、LongVarChar型にしてみたら、
なぜか受け付けてくれました。
(データベース内のテーブルは、CLOBのままです。)


内部で嬉しいことをやってくれてるんでしょうね。

引用:

一応動いていそうですが、明らかに正しい対処法ではないと思いますので、
もし、他の方法で解決していたらぜひ教えて下さい。


aacute さんの方法は試されましたか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2007/04/04
投稿数: 1
投稿日時: 2007-04-04 16:02
当方でも同様の現象が出ました。
確かにOracleType.LongVarCharでも解決できましたが、
パラメータオブジェクトのサイズ指定を以下のようにしても登録できました。

OracleParameter prm = new OracleParameter();
prm.ParameterName = <パラメータ名>;
prm.OracleType = OracleType.Clob;
prm.Value = <ながーい文字列>;
prm.Size = System.Text.Encoding.Unicode.GetByteCount(prm.Value);
prm.Direction = ParameterDirection.Input;

Sizeプロパティを文字列のLengthプロパティの値に設定→×
Unicodeエンコーディングしたバイト長を指定→○

尚、当方のOracle(10.1.0.2.0)のキャラクタセットはUnicodeです。
それ以外は未検証です。
1

スキルアップ/キャリアアップ(JOB@IT)