“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 列类型。不正确行为的原因更加模糊,只有满足以下所有条件时才会发生:
- 当我们设置 IDbDataParameter.Value = (string which length is : 4000 > length > 2000 )
- 当我们设置 IDbDataParameter.DbType = DbType.String
- 当数据库列的类型为 NCLOB/CLOB
在这种情况下,您必须在设置参数方法重载中设置数据库列类型,因此:
executedQuery.SetParameter("CONTENT", data.Content, NHibernateUtil.StringClob);
我在网上搜索过这个问题,但我的问题不一样。
我正在使用 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 列类型。不正确行为的原因更加模糊,只有满足以下所有条件时才会发生:
- 当我们设置 IDbDataParameter.Value = (string which length is : 4000 > length > 2000 )
- 当我们设置 IDbDataParameter.DbType = DbType.String
- 当数据库列的类型为 NCLOB/CLOB
在这种情况下,您必须在设置参数方法重载中设置数据库列类型,因此:
executedQuery.SetParameter("CONTENT", data.Content, NHibernateUtil.StringClob);