『壹』 如何使用Nhibernate动态连接Oracle数据库
关于如何使用Nhibernate配置连接其支持的数据源,网上一些相关的文档已经详细作了说明,同时在其2.0帮助文档中也有相关的描述。一般常用的有两种方式:
一、使用配置文件nfig)连接数据库
下面以使用Nhibernate2.2连接Oracle10数据库为例,给出连接配置信息如下:
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="nnection_string">User ID=hzga;Password=hzga;Data Source=orcl;Persist Security Info=True;</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
</session-factory>
</hibernate-configuration>
二、通过提供一个IDictionary实例连接数据库
下面还是以使用Nhibernate2.2连接Oracle10数据库为例,给出连接配置信息如下:
cfg = new Configuration();
IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OracleClientDriver");
connProps.Add("nnection_string", "User ID=hzga;Password=hzga;Data Source=orcl;Persist Security Info=True;");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
三、如何使用Nhibernate动态直接连接Oracle数据库
上述两种方式都可以成功连接到Oracle数据库,但是前提条件是运行程序时需要安装Oracle客户端。在程序发布部署的时候安装Oracle客户端是一件非常麻烦的事件,那么有没有一种比较好的方法可以直接连接Oracle数据库,同时又不必安装Oracle客户端呢。
答案是肯定的,下面提供两种方式直接连接Oracle数据库:
1、通过OleDB和Oracle公司的驱动
cfg = new Configuration();
IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OleDbDriver");
connProps.Add("nnection_string", "Provider=OraOLEDB.Oracle.1;User ID=hzga;Password=hzga;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.13.148)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
2、通过OLEDB和微软公司的Oracle驱动
cfg = new Configuration();
IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OleDbDriver");
connProps.Add("nnection_string", " Provider=MSDAORA.1;User ID=lportal;Password=lportal;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = zhbrserver)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
『贰』 NHibernate 连接多数据库怎么配置
sqlserver数据库连接放在配置文件中,只是针对外部程序访问sqlserver的场景,几种不同连接方式(odbc,ef,nhibernate,mybitas,等等),连接字符串也有所不同,你在网上搜一下,sqlserver连接字符串格式就知道了,配置文件的话,分2种,一种是建立项目时自带的config文件,这种文件的读写访问.net自己就有方法支持,文件格式和对应节点的说明也很详细;自己建立一个配置文件(可以是txt,xml等,格式可以自己控制,不过需要自己去编写相应的读写方法);
上面2种方式,各有优劣,第1种,使用系统自带的配置文件,操作方便,但是这个文件有个要注意的地方,就是它一般是在系统启动时去加载文件信息,在程序运行过程中,修改了配置文件的值,需要下次重启软件才会生效。
不过一般数据库连接字符串这种,在程序运行过程中,变化的几率小,直接用自带config文件就可以满足需求
『叁』 NHibernate中Session的处理
NHibernate中Session是线程不安全的 而且每次数据库操作请求创建Session时对性能有些影响 在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安全 而在Web中可以通过将Session与用于请求HttpContext绑定实现线程安全 并且用户当前请求时只有一个Session 代码如下
ISessionManage cs
using System;using NHibernate;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 主要用于封装第三方类库操作数据库的Session类 现主要用于封装NHibernate中的Session /// </summary> public interface ISessionManage { /// <summary> /// 获取Session的一个实例 /// </summary> /// <returns>返回实现NHibernate ISession接口的类</returns> ISession Get();
/// <summary> /// 设置Session的一个实例 /// </summary> /// <param name= session >实现NHibernate ISession接口的类</param> void Set(ISession session); }}
--------------------------------------------
WebNHSession cs
using System;using System Web;using NHibernate;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 此类用于Web应用 NHibernate提供的Session有两个缺陷 /// 一方面是线程不安全的 另一方面每次数据库操作创建一个Session对程序性能有影响 /// 因此通过将Session绑定到HttpContext上 这样每个用户具有唯一的一个Session 而且 /// 在用户的请求结束后关闭Session并自己释放掉 /// </summary> public class WebNHSession : ISessionManage { public WebNHSession() {
}
/// <summary> /// 获取存储到HttpContext中的实现NHibernate ISession接口的类实例 /// </summary> /// <returns>实现NHibernate ISession接口的类实例 当用户之前没有调用Set方法会返回Null</returns> public ISession Get() { return (ISession)HttpContext Current Items[SessionConfigManage SessionSourceItemName]; }
/// <summary> /// 存储实现NHibernate ISession接口的类实例到HttpContext中 /// </summary> /// <param name= session >实现NHibernate ISession接口的类实例</param> public void Set(ISession session) { if (session != null) { HttpContext Current Items Add(SessionConfigManage SessionSourceItemName session); } else { HttpContext Current Items Remove(SessionConfigManage SessionSourceItemName); } } }}---------------------------------------------
WinFormNHSession cs
using System;using NHibernate;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 此类用于Windows应用 NHibernate提供的Session有两个缺陷 /// 一方面是线程不安全的 另一方面每次数据库操作创建一个Session对程序性能有影响 /// 因此通过线程变量获取一个NHibernate Session的多个线程安全的实例 而且线程变量使用后即释放掉 /// </summary> public class WinFormNHSession : ISessionManage { [ThreadStatic] private static ISession _threadSession = null;
public WinFormNHSession() { }
/// <summary> /// 获取存储到线程变量中的实现NHibernate ISession接口的类实例 /// </summary> /// <returns>实现NHibernate ISession接口的线程安全的类实例 当用户之前没有调用Set方法会返回Null</returns> public ISession Get() { if (_threadSession != null) { if (_threadSession IsConnected) { _threadSession Reconnect(); } } return _threadSession; }
/// <summary> /// 存储实现NHibernate ISession接口的类实例到线程变量中 /// </summary> /// <param name= session >实现NHibernate ISession接口的类实例</param> public void Set(ISession session) { if (_threadSession IsConnected) { session Disconnect(); } _threadSession = session; } }}
SessionFactory cs
using System;using System Runtime Remoting;using NHibernate;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 管理多个实现ISessionManage接口的类工厂 根据读取的要加载的类名称信息 进行动态的创建Session /// </summary> public class SessionFactory { private static ISession session = null; private static ISessionManage sessionManage = null; static SessionFactory() { Init(); }
/// <summary> /// 获取实现NHibernate ISession接口的Session实例 /// </summary> /// <returns>返回实现NHibernate ISession接口的类实例</returns> public static ISession GetSession() { session = sessionManage Get(); if (session == null) { session = NHibernateSession GetNHibernateSession(); sessionManage Set(session); }
return session; }
private static void Init() { System Reflection Assembly ass = System Reflection Assembly Load(SessionConfigManage AssemblyName); sessionManage = (ISessionManage)ass CreateInstance(SessionConfigManage SessionSourceItemName); } }}----------------------------------------------
NHibernateSession cs
using System;using System Data;using System Collections Generic;using System Text;using NHibernate;using NHibernate Cfg;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 加载嵌入资源(Xml配置文件) 打开一个SessionFactory 获取NHibernate的Session实例 /// </summary> public class NHibernateSession { private static Configuration cfg = null; private static ISessionFactory sessionFactory = null;
static NHibernateSession() { cfg = new Configuration() Configure(); sessionFactory = cfg BuildSessionFactory(); }
/// <summary> /// 获取NHibernate的Session实例 /// </summary> /// <returns></returns> public static ISession GetNHibernateSession() { return sessionFactory OpenSession(); } }}---------------------------------------------
SessionConfigManage cs
using System;using System Collections Generic;using System Text;using System Configuration;
namespace Commercial Jwsoft Framework Persistence SessionManage{ /// <summary> /// 功能 根据类库的应用环境不同(Windows应用还是Web应用) 动态创建类实例 /// 日期 /// 作者 郭少宏 /// </summary> public class SessionConfigManage { private const string SESSION_ITEM_NAME = SessionItemName ; private static object _locker = new object(); private static string _sessionItemName = string Empty; private static string _assemblyName = string Empty;
static SessionConfigManage() { string configString = ConfigurationManager AppSettings[SESSION_ITEM_NAME]; string[] arr = configString Split( ); _sessionItemName = arr[ ]; _assemblyName = arr[ ]; } /// <summary> /// 获取配置文件中名为SESSION_ITEM_NAME配置节的信息 记录的要加载的SessionManage的类全称 /// </summary> /// <returns>实现ISessionManage接口的类的名称</returns> public static string SessionSourceItemName { get { lock (_locker) { return _sessionItemName; } } }
/// <summary> /// 获取配置文件中名为SESSION_ITEM_NAME配置节的信息 记录的要加载的SessionManage的类全称 /// </summary> /// <returns>实现ISessionManage接口的类的程序集名称</returns> public static string AssemblyName { get { lock (_locker) { return _assemblyName; } } } }}
在Web Config文件中的配置节如下
<appSettings> <! > <! 在Web应用中加载的获取Session的类名称 > <add key= SessionItemName value= Commercial Jwsoft Framework Persistence SessionManage WebNHSession JWFramework /> <! 在Windows应用中加载的获取Session的类名称 > <! <add key= SessionItemName value= Commercial Jwsoft Framework Persistence SessionManage WinFormNHSession JWFramework /> > </appSettings>
在Global asax中添加如下代码
/// <summary> /// 当用户断开请求时用来关闭用户请求的Session的连接 /// </summary> /// <param name= sender ></param> /// <param name= e ></param> void Session_End(object sender EventArgs e) { NHibernate ISession session = Commercial Jwsoft Framework Persistence SessionManage SessionFactory GetSession(); if (session != null) { session Close(); }
lishixin/Article/program/net/201311/13675
『肆』 Nhibernate 用 App.Config 配置 出错
应该不是配置文件问题,而是你的NHibernate安装问题,缺少某个文件,或者该文件的权限由问题
『伍』 NHibernate配置文件写法
NHibernate的联合主键
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="RG.SuperStarSystem.Accounts.Data.JJDepartments,RG.SuperStarSystem.Accounts.Data"
table="PersonManager_JJDepartments">
<composite-id>
<key-property name="ID" column="ID" type="String" length="2" />
<key-property name="MainJJDepartmentID" column="MainJJDepartmentID" type="String" length="2" />
</composite-id>
<property name="Name" column="Name" type="String" length="40"></property>
<property name="SimpleName" column="SimpleName" type="String" length="6"></property>
<property name="Description" column="Description" type="String" length="50"></property>
</class>
</hibernate-mapping>
基本写法
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
『陆』 用Nhibernate怎么实现数据的添加,删除,修改简单程序
一、创建数据库
数据库名:Nhibernate
use NHibernate
go
CREATE TABLE users (
LogonID nvarchar(20) NOT NULL default '0',
Name nvarchar(40) default NULL,
Password nvarchar(20) default NULL,
EmailAddress nvarchar(40) default NULL,
PRIMARY KEY (LogonID)
)
go
数据表:users
二、总体介绍
项目名:WebNhibernate
界面:WebForm.aspx
具体表现文件:WebForm.aspx.cs
实体类文件:EntityClass.cs
映射文件:Userhbm.xml
配置文件:Web.config
三、创建Web界面
类型
对象名
Text属性值
Label
Label1
ID:
Label
Label2
姓名:
Label
Label3
密码:
Label
Label4
Email:
Label
Labmessage
TextBox
TxtId
TextBox
TxtName
TextBox
TxtPassword
TextBox
TxtEmail
Button
ButSave
添加
Button
ButDel
删除
Button
ButUpdata
修改
四、创建映射文件(xml文件)和实体类
实体类
using System;
namespace WebNhibernate
{
public class EntityClass
{
private string id;
private string userName;
private string password;
private string emailAddress;
public EntityClass()
{}
public string Id
{
get { return id; }
set { id = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
}
}
映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="WebNhibernate.EntityClass, WebNhibernate" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="string" length="40"/>
<property name="Password" type="string" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
</class>
</hibernate-mapping>
注意点:
1.<class name="WebNhibernate.EntityClass, WebNhibernate" table="users">
WebNhibernate.EntityClass代表:实体类名
WebNhibernate代表:该项目的装配集名称
Users代表:数据表名
2.当属性列表<property name=”” column=””/>中既有name和column说明实体层的属性与数据表的字段名不同名
3.指定一个id, 在数据表中就是主键, 这个非常重要,nhibernate就是通过id来判断对象的唯一性的.
五、在配置文件中添加配置内容
1.首先在配置文件的<configuration>代码下面添加如下代码
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
这一段代码是必须要的
2.在配置文件的</system.web>代码下面添加如下代码
<nhibernate>
<!—连接数据提供者 -->
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<!—连接数据方言最常用的是MsSql2000Dialect -->
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<!—连接数据驱动类-->
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<!—连接数据库-->
<add
key="hibernate.connection.connection_string"
value="Server=yanfa1;initial catalog=nhibernate;User id=sa;password=8626798;"
/>
</nhibernate>
六、实现代码
首先在文件头添加代码
using NHibernate;
using NHibernate.Cfg;
1.添加数据:
双击“添加“按钮
private void ButSave_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();//创建配置类
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));//指明映射文件Userhbm.xml
EntityClass vEntity=new EntityClass();
vEntity.Id=TxtId.Text;
vEntity.UserName=TxtName.Text;
vEntity.Password=TxtPassword.Text;
vEntity.EmailAddress=TxtEmail.Text;
ISession vSession= mCfg.BuildSessionFactory().OpenSession();//创建会话工厂, 一般来说应该使用一个单例对象来封装会话工厂.
ITransaction vTransaction = vSession.BeginTransaction();//创建事物处理
try
{
vSession.Save(vEntity);//向数据库添加数据
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error"+ex.ToString();
}
finally
{
vSession.Close();
}
}
2.删除数据:
双击“删除“按钮
private void ButDel_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));
ISession vSession= mCfg.BuildSessionFactory().OpenSession();
ITransaction vTransaction = vSession.BeginTransaction();
try
{
EntityClass vEntity=(EntityClass) vSession.Load(typeof(EntityClass),TxtId.Text);//查找数据表中所要记录
vSession.Delete(vEntity);//向数据库删除数据
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error";
}
finally
{
vSession.Close();
}
}
3.修改代码:
双击“修改“按钮
private void ButUpdata_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));
ISession vSession= mCfg.BuildSessionFactory().OpenSession();
ITransaction vTransaction = vSession.BeginTransaction();
try
{
EntityClass vEntity=(EntityClass) vSession.Load(typeof(EntityClass),TxtId.Text);
vEntity.UserName=TxtName.Text;
vEntity.Password=TxtPassword.Text;
vEntity.EmailAddress=TxtEmail.Text;
vSession.Update(vEntity); //向数据库修改数据
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error";
}
finally
{
vSession.Close();
}
}
『柒』 NHibernate配置文件的问题
老大有你这么写滴?
<mapping assembly="Person.hbm.xml"/>这个是添加映射程序集用的,你把xml搞在这里做什么?
这里写上你的Person.hbm.xml文件所在的程序集名称;
然后把Person.hbm.xml这个文件的属性设置为嵌入式始终复制就行了
『捌』 NHibernate 配置文件上的连接池是怎么配置的(app.config),主要是处理并发数据 急~~~~~
<add key="hibernate.connection.connection_string" value="server=.;database=testdb;uid=testsa;pwd=123456;Min Pool Size=20;Max Pool Size=60" />
Min Pool Size: 最小允许 Max Pool Size:最大允许
『玖』 nhibernate多个数据库hbm.xml,cfg.xml该怎么配置
1、MYSQL5 数据库
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernate.Test">
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.connection_string">Server=192.168.0.2;Port=3306;Database=SampeDataBase;User ID=root;Password=root;CharSet=utf8</property>
<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="hbm2ddl.keywords">none</property>
<mapping assembly="XXXX.Infrastructure.Entities"/>
</session-factory>
</hibernate-configuration>
尤其要强调的是 <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
在数据表设计中如果采用了 bit 类型的字段,并且对应了业务类中类型为 bool 值,一定要如上设置下。
2、MSSQL 数据库
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Data Source=192.168.0.2,1433;Initial Catalog=SampeDataBase;
Integrated Security=False;User Id=sa;Password=;
</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="proxyfactory.factory_class"> NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<mapping assembly="XXXX.Infrastructure.Entities"/>
</session-factory>
</hibernate-configuration>
mssql 不同的版本有时需要修改下属性 dialect (方言)
上面是 ms sql 2005 的配置,在使用 sql 2000 时有方法会出错(比如分页)
ms sql 2000 的配置
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>