“在NHibernate中设置参数时,ORA-01461:只能将LONG值绑定到LONG列”

时间:2016-12-29 12:26:08

标签: c# oracle nhibernate oracle11g fluent-nhibernate

我在互联网上搜索过这个问题,但我的问题不同了。 我正在使用Fluent NHibernate并尝试使用sql查询插入数据:

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)中, CONTENT 的数据类型为NCLOB。当尝试插入数据时,我收到此错误:

  

ORA-01461:只能插入LONG值才能插入LONG列

这里有什么问题?

1 个答案:

答案 0 :(得分:4)

这个错误不是很有用,而且它很可能导致有关oracle补丁等的主题。实际上,这是microsoft oracle客户端驱动程序的错误。驱动程序错误地推断了正在保存的字符串的列类型,并尝试强制服务器将LONG值更新为CLOB / NCLOB列类型。行为不正确的原因更加模糊,只有在满足以下所有条件时才会发生:

  1. 当我们设置IDbDataParameter.Value =(字符串,其长度为:4000>长度> 2000)
  2. 当我们设置IDbDataParameter.DbType = DbType.String
  3. 当DB Column的类型为NCLOB / CLOB
  4. 在这种情况下,您必须在set参数方法重载中设置数据库列类型,所以:

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