Heim > Datenbank > MySQL-Tutorial > 用NHibernate调用Oracle的存储过程

用NHibernate调用Oracle的存储过程

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-07 16:55:30
Original
1189 Leute haben es durchsucht

NHibernate2.1.1版终于可以调用Oracle的存储过程了,不过必须使用NHibernate.Driver.OracleDataClientDriver驱动(Oracle.DataAc

摘要

NHibernate2.1.1版终于可以调用Oracle的存储过程了,不过必须使用NHibernate.Driver.OracleDataClientDriver驱动(Oracle.DataAccess.dll),但这会导致hbm2ddl.keywords抛异常,所以也不是很完美。

NHibernate调用Oracle的存储过程的方法

首先,在Oracle10g里面创建一个简单的存储过程,它的第一个参数必须是SYS_REFCURSOR类型的。

存储过程 or replace procedure spCustomer_get_by_name(cur_OUT out SYS_REFCURSOR, customer_name VARCHAR2) is

begin

open cur_OUT for

select *

FROM Customer c

WHERE c.firstname LIKE '%'||customer_name;

end spCustomer_get_by_name;  Customer表结构如下。

Customer表结构 table CUSTOMER

(

CUSTOMERID     VARCHAR2(36) not null,

VERSION        VARCHAR2(200),

FIRSTNAME      VARCHAR2(200),

LASTNAME       VARCHAR2(200),

ISDELETE       NUMBER(1),

CREATETIME     DATE,

ESTABLISH_DATE DATE,

AGE            NUMBER(10),

INCOME         NUMBER(19,4),

CUSTOMER_TYPE  NUMBER(10)

)  在Customer.hbm.xml里面,增加调用存储过程的配置。

Code highlighting produced by Actipro CodeHighlighter (freeware)>sql-query>

return alias="cus">

return>

{ call spCustomer_get_by_name(:customer_name) }

sql-query>  调用存储过程的C#代码为:

Code highlighting produced by Actipro CodeHighlighter (freeware)>ISession session =

IQuery q = session.GetNamedQuery("SelectCustomerByName");

q.SetString("customer_name", "景");

IListCustomer> cList = q.ListCustomer>();

  现在已经可以运行下试试了,不过很可能会抛出“OracleClientDriver does not support CallableStatement syntax (stored procedures). Consider using OracleDataClientDriver instead.”这个异常,如果你和我一样用的是“NHibernate.Driver.OracleClientDriver”的话。解决方法是,在hibernate.cfg.xml文件里把“

NHibernate.Driver.OracleClientDriver”改成“NHibernate.Driver.OracleDataClientDriver”,然后把“Oracle.DataAccess.dll”(在Oracle客户端的安装目录下可以找到它)复制到网站的bin目录下。

  再次运行程序,会抛出“无法将类型为“Oracle.DataAccess.Client.OracleConnection”的对象强制转换为类型“System.Data.Common.DbConnection”。 ”异常。引发这个异常的是“NHibernate\Tool\hbm2ddl\SuppliedConnectionProviderConnectionHelper.cs”。第25行:“connection = (DbConnection)provider.GetConnection();”。有一个方法可以绕过这行代码的执行,,就是在hibernate.cfg.xml里增加一行“

none”。但其实“hbm2ddl.keywords”是一个挺不错的功能(有兴趣可以Google下这个关键字),不能用它挺遗憾的,而且也不知道除了这个之外是否还有其它功能会受到影响,心里毛毛的。

  除了上面的演示,还可以调用Oracle的Function获取数据,也可以调用存储过程进行增、删、改操作,请参考“NHibernate-2.1.1.GA-src\src\NHibernate.Test\SqlTest\Custom\Oracle”目录下的源代码。

linux

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage