『壹』 如何使用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怎么实现数据的添加,删除,修改简单程序
一、创建数据库数据库名:Nhibernateuse NHibernategoCREATE 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属性值LabelLabel1ID:LabelLabel2姓名:LabelLabel3密码:LabelLabel4Email:LabelLabmessage TextBoxTxtId TextBoxTxtName TextBoxTxtPassword TextBoxTxtEmail ButtonButSave添加ButtonButDel删除ButtonButUpdata修改 四、创建映射文件(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>