【问题标题】:“ORA-01461: can bind a LONG value only for insert into a LONG column” when set parameter in NHibernate在 NHibernate 中设置参数时,“ORA-01461:只能绑定 LONG 值以插入 LONG 列”
【发布时间】:2017-05-13 18:42:55
【问题描述】:

我在互联网上搜索过这个问题,但我的问题不同。 我正在使用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 传递给方法。 CONTENT 的数据库(Oracle 11g)数据类型是NCLOB。尝试插入数据时,出现此错误:

ORA-01461: 只能绑定 LONG 值以插入 LONG 列

这里有什么问题?

【问题讨论】:

  • data.Content是什么类型?
  • @M.Wiśnicki,data.Content 是 string,例如:“

    Some text

    ”。如果字符串长度大于 2000,则会发生此错误,以防
  • 您使用哪个版本的 ODAC?

标签: c# oracle nhibernate oracle11g fluent-nhibernate


【解决方案1】:

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

  1. 当我们设置 IDbDataParameter.Value = (字符串长度为 : 4000 > length > 2000 )
  2. 当我们设置 IDbDataParameter.DbType = DbType.String
  3. 当 DB 列是 NCLOB/CLOB 类型时

这种情况你必须在设置参数方法重载中设置数据库列类型,所以:

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

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2014-09-20
    • 2013-06-01
    • 2017-08-29
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2014-08-09
    相关资源
    最近更新 更多