2016-12-29 100 views
2

インターネットでこの問題を検索していますが、問題が異なります。 私はFluent NHibernateを使用して、SQLクエリを使用して挿入データを試している:ここで"ORA-01461:LONG列に挿入するLONG値のみをバインドできます" NHibernateでパラメータが設定されている場合

var query = "INSERT INTO TABLE_NAME('ID','CONTENT') VALUES(:ID, :CONTENT)"; 
var executedQuery = Session.CreateSQLQuery(query); 

executedQuery.SetParameter("ID", data.Id); 
executedQuery.SetParameter("CONTENT", data.Content); 
executedQuery.ExecuteUpdate(); 

dataメソッドに渡します。データベース(Oracle 11g)のデータ型はです。内容NCLOBです。データを挿入しようとすると、次のエラーが表示されます。

ORA-01461: can bind a LONG value only for insert into a LONG column

ここで問題は何ですか?

+0

どのようなタイプの 'data.Content'ですか? –

+0

@M.Wiśnicki、data.Contentは 'string'です(例:"

Some text

")。文字列の長さが2000より大きい場合、<2000の挿入作業の場合にこのエラーが発生しました。 – vaqifrv

+0

あなたはどのバージョンのODACを使用していますか? –

答えて

3

このエラーはそれほど役に立ちませんし、ゴーグルすると、おそらくオラクルパッチなどに関するトピックになります。現実には、これはMicrosoft oracleクライアントドライバのバグです。ドライバは誤って保存される文字列の列型を推測し、サーバーにLONG値をCLOB/NCLOB列型に更新させようとします。不正な動作の理由はもっとあいまいで、次のすべての条件が満たされたときにのみ起こる:

  1. 我々はIDbDataParameter.Value =(長さである文字列:4000>長さ> 2000)を設定するとき
  2. を我々はIDbDataParameter.DbType = DbType.Stringを設定すると
  3. DBの列は、そのように、設定されたパラメータのメソッドオーバーロードでは、データベースの列タイプを設定する必要があります。このような状況ではタイプNCLOB/CLOB

であるとき:

executedQuery.SetParameter("CONTENT", data.Content, NHibernateUtil.StringClob); 
+0

ありがとうbrooo :) – vaqifrv

関連する問題