2016-12-29 99 views
2

我在网上搜索这个问题,但我的问题是不同的。 我使用Fluent NHibernate,并尝试与SQL查询插入数据:在NHibernate中设置参数时,“ORA-01461:只能绑定LONG值才能插入到LONG列”

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)数据类型CONTENTNCLOB。当尝试插入数据时,出现此错误:

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

这里的问题是什么?

+0

data.Content是什么类型? –

+0

@M.Wiśnicki,data.Content是'string',例如:“

一些文本

”。如果字符串长度大于2000,则发生此错误,以防<2000插入工作。 – vaqifrv

+0

您使用的是哪个版本的ODAC? –

回答

3

这个错误不是很有帮助,它会很有可能导致关于oracle补丁等问题。实际上,这是Microsoft客户端驱动程序的错误。驱动程序错误地推断正在保存的字符串的列类型,并尝试强制服务器将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

相关问题