『壹』 如何使用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>