Oracle: ORA-01461 仅可以为插入 LONG 列的 LONG 值赋值(can bind a LONG value only for insert into a LONG )
(以下都为个人总结,非官方解决办法)
ORA-01461解决办法:
引起原因: 主要为CLOB,BLOB等大字段数据Insert引起.
我的环境: WCF + NHibernate 2.1.1 + Oracle 10g + OracleClient19g
先在 下载Oracle 10g Release 2 ODAC and Oracle Developer Tools for Visual Studio .NET, 配置好数据库的链接(确保没问题,自带测试程序,可以做测试)
接下来开始配置我们的WCF Web环境 & NHibernate.cfg.xml
1. 在web.config中加入以下配置
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- Oracle 11g Config Only one be enable -->
<qualifyAssembly partialName="Oracle.DataAccess" fullName="Oracle.DataAccess, Version=2.111.6.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</assemblyBinding>
<!-- Oracle 10g Config, Only one be enable -->
<qualifyAssembly partialName="Oracle.DataAccess" fullName="Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</assemblyBinding>
</runtime>
</configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- Oracle 11g Config Only one be enable -->
<qualifyAssembly partialName="Oracle.DataAccess" fullName="Oracle.DataAccess, Version=2.111.6.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</assemblyBinding>
<!-- Oracle 10g Config, Only one be enable -->
<qualifyAssembly partialName="Oracle.DataAccess" fullName="Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</assemblyBinding>
</runtime>
</configuration>
2. 在hibernate.cfg.xml中坐如下修改
<property name="connection.driver_class">HNibernate.Driver.OracleDataClientDriver, NHibernate</property>
3. 个人理解
Oracle.DataAccess应该是Oracle 为.Net 类库提供的一套数据库访问组件,但是否是基于System.Data.OracleClient的,由于时间的关系,没做过多的研究.
配置好之后,插入CLOB字段数据测试成功
备注:
a. Oracle 总客户端程序一定要跟服务端程序做对应, 貌似在Oracle 的产品体系架构中不存在高版本自适应低版本的规则(这一点上微软就不一样了,更人性化,哈哈,我想Oracle 也肯定有他的理由,并不是说Oracle不好哦!)
b. 对于CLOB字段在hibernate映射文件中的类型对应, sql-type="CLOB" type="String"(对应C#类型的映射)
可以草考的其他资料:
http://forums.oracle.com/forums/thread.jspa?threadID=259360&tstart=0