“ORA-01461:在 NHibernate 中设置参数时,只能绑定一个 LONG 值以插入到 LONG 列中”

“ORA-01461: can bind a LONG value only for insert into a LONG column” when set parameter in 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: can bind a LONG value only for insert into a LONG column

这里有什么问题?

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

  1. 当我们设置 IDbDataParameter.Value = (string which length is : 4000 > length > 2000 )
  2. 当我们设置 IDbDataParameter.DbType = DbType.String
  3. 当数据库列的类型为 NCLOB/CLOB

在这种情况下,您必须在设置参数方法重载中设置数据库列类型,因此:

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