public class SessionManager
{
# region 当前单实例
private readonly static SessionManager instance = new SessionManager();
/// <summary>
/// 当前实例
/// </summary>
public static SessionManager CurrInstance
{
get
{
return instance;
}
}
# endregion
private ISessionFactory _sessionFactory;
private SessionManager()
{
_sessionFactory = GetSessionFactory();
}
private ISessionFactory GetSessionFactory()
{
//string strFilePaht = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "hibernate.cfg.xml";
Configuration config = (new Configuration()).Configure();
glo.DataBaseDerived = config.GetDerivedProperties()["connection.driver_class"].ToString();
return config.BuildSessionFactory();
}
/// <summary>
/// 获取Session
/// </summary>
/// <returns></returns>
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
/// <summary>
/// 初始数据库设置
/// </summary>
public void DbInitial()
{
ISession _session= _sessionFactory.OpenSession();
_session.Close();
}
}
public class NhibernateHelper : IDbHelper
{
# region 当前单实例
private readonly static NhibernateHelper instance = new NhibernateHelper();
public static NhibernateHelper CurrInstance
{
get
{
return instance;
}
}
# endregion
/// <summary>
/// 新增记录
/// </summary>
/// <param name="Model"></param>
/// <returns></returns>
public bool CreateModel(object Model)
{
bool bl = true;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{ _session.Save(Model);
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
bl = false;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return bl;
}
/// <summary>
/// 修改记录
/// </summary>
/// <param name="Model"></param>
/// <returns></returns>
public bool UpdateModel(object Model)
{
bool bl = true;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{
_session.Update(Model);
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
bl = false;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return bl;
}
/// <summary>
/// 批量保存更新实体类
/// </summary>
/// <param name="Models"></param>
/// <returns></returns>
public bool SaveOrUpdateModel(IList<object> Models)
{
bool bl = true;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{
foreach (var Model in Models)
{
_session.Update(Model);
}
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
bl = false;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return bl;
}
/// <summary>
/// 删除记录
/// </summary>
/// <param name="Model"></param>
/// <returns></returns>
public bool DeleteModel(object Model)
{
bool bl = true;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{
_session.Delete(Model);
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
bl = false;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return bl;
}
/// <summary>
/// 删除记录(ByID)
/// </summary>
/// <param name="Model"></param>
/// <returns></returns>
public bool DeleteModelByID(string entityName, object ID)
{
bool bl = true;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{
object Model=_session.Get(entityName, ID);
_session.Delete(Model);
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
bl = false;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return bl;
}
/// <summary>
/// 按ID查找记录
/// </summary>
/// <param name="entityName">实体类的名字</param>
/// <param name="ID">记录ID</param>
/// <returns></returns>
public object GetModelById(string entityName,object ID)
{
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
try
{
return _session.Get(entityName, ID);
}
catch (HibernateException ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
}
/// <summary>
/// 执行Hql查询语句
/// </summary>
/// <param name="hql"></param>
/// <returns></returns>
public IList<object> CreateHqlQuery(string hql)
{
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
try
{
return _session.CreateQuery(hql).List<object>();
}
catch (HibernateException ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
}
/// <summary>
/// 执行Hql查询语句,不直接释放session,请在外部使用时加using释放
/// </summary>
/// <param name="hql"></param>
/// <returns></returns>
public IList<object> CreateHqlQueryNoRelease(string hql, ref ISession _session)
{
try
{
_session = SessionManager.CurrInstance.GetSession();
return _session.CreateQuery(hql).List<object>();
}
catch(HibernateException ex)
{
throw ex;
}
}
/// <summary>
/// 执行Hql语句,并返回object[],例子:select c.Name, count(c.Name) from Gbook c group by c.Name
/// </summary>
/// <param name="hql"></param>
/// <returns></returns>
public IList<object[]> CreateHqlQuery_Arry(string hql)
{
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
try
{
return _session.CreateQuery(hql).List<object[]>();
}
catch (HibernateException ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
}
/// <summary>
/// 执行Hql,更新、删除语句,多条语句使用 ; 间隔
/// </summary>
/// <param name="hql"></param>
/// <returns>返回执行记录数</returns>
public int CreateHqlQuery_UpdateAndDelete(string hql)
{
int Count = 0;
int i = 0;
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
ITransaction tx = _session.BeginTransaction();
try
{
string[] strArry=hql.Split(';');
foreach (string strhql in strArry)
{
i = _session.CreateQuery(strhql).ExecuteUpdate();
Count += i;
}
_session.Flush();
tx.Commit();
}
catch (HibernateException ex)
{
Count = -1;
tx.Rollback();
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
return Count;
}
/// <summary>
/// 执行Sql查询语句
/// </summary>
/// <param name="hql"></param>
/// <returns></returns>
public IList<object> CreateSqlQuery(string sql)
{
using (ISession _session = SessionManager.CurrInstance.GetSession())
{
try
{
return _session.CreateSQLQuery(sql).List<object>();
}
catch (HibernateException ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
}
}
/// <summary>
/// 执行sql语句,没有返回数据集,提供事务支持
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public bool ExecuteNonQuery(string sql)
{
return ExecuteNonQuery(sql, null);
}
/// <summary>
/// 执行sql语句,没有返回数据集,提供事务支持
/// </summary>
/// <param name="sql"></param>
/// <param name="paramenters"></param>
/// <returns></returns>
public bool ExecuteNonQuery(string sql, IDbDataParameter[] paramenters)
{
bool bl = false;
ISession _session = null;
ITransaction transaction = null;
try
{
_session = SessionManager.CurrInstance.GetSession();
transaction = _session.BeginTransaction();
IDbCommand command = _session.Connection.CreateCommand();
transaction.Enlist(command);//注意此处要把command添加到事物中
command.CommandText = sql;
if (paramenters != null)
{
foreach (IDataParameter parm in paramenters)
{
command.Parameters.Add(parm);
}
}
int i=command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
if (transaction != null)
{
transaction.Rollback();
}
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
return bl;
}
/// <summary>
/// 填充DataSet,方法二
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet ExecuteDataset2(string sql)
{
ISession _session = null;
DataSet ds = new DataSet();
try
{
_session = SessionManager.CurrInstance.GetSession();
IDbCommand command = _session.Connection.CreateCommand();
command.CommandText = sql;
IDataReader reader = command.ExecuteReader();
DataTable result = new DataTable();
//result.Load(reader);//此方法亦可
DataTable schemaTable = reader.GetSchemaTable();
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
string columnName = schemaTable.Rows[i][0].ToString();
result.Columns.Add(columnName);
}
while (reader.Read())
{
int fieldCount = reader.FieldCount;
object[] values = new Object[fieldCount];
for (int i = 0; i < fieldCount; i++)
{
values[i] = reader.GetValue(i);
}
result.Rows.Add(values);
}
ds.Tables.Add(result);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
return ds;
}
/// <summary>
/// 填充DataSet(此方法亦可)
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet ExecuteDataset(string sql)
{
return ExecuteDataset(sql, null);
}
/// <summary>
/// 填充DataSet
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet ExecuteDataset(string sql,IDbDataParameter[] paramenters)
{
ISession _session = null;
DataSet ds = new DataSet();
try
{
_session = SessionManager.CurrInstance.GetSession();
IDbCommand command = _session.Connection.CreateCommand();
command.CommandText = sql;
if (paramenters != null)
{
foreach (IDataParameter parm in paramenters)
{
command.Parameters.Add(parm);
}
}
switch (glo.DataBaseType)
{
case DataBaseType.SqlServer:
SqlDataAdapter da = new SqlDataAdapter(command as SqlCommand);
da.Fill(ds);
break;
case DataBaseType.MySql:
MySqlDataAdapter daMy = new MySqlDataAdapter(command as MySqlCommand);
daMy.Fill(ds);
break;
case DataBaseType.Oracle:
OracleDataAdapter daOrl = new OracleDataAdapter(command as OracleCommand);
daOrl.Fill(ds);
break;
default:
break;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (_session != null)
{
_session.Close();
}
}
return ds;
}
}
/// <summary>
/// 数据库类型
/// </summary>
public enum DataBaseType
{
MySql,
SqlServer,
Oracle
}
public class glo
{
private static string dataBaseDerived = "";
/// <summary>
/// Nhibernate数据库驱动配置
/// </summary>
public static string DataBaseDerived
{
set
{
dataBaseDerived = value;
switch (dataBaseDerived)
{
case "NHibernate.Driver.MySqlDataDriver":
dataBaseType = DataBaseType.MySql;
break;
case "NHibernate.Driver.SqlClientDriver":
dataBaseType = DataBaseType.SqlServer;
break;
case "NHibernate.Driver.OracleClientDriver":
dataBaseType = DataBaseType.Oracle;
break;
}
}
get
{
return dataBaseDerived;
}
}
private static DataBaseType dataBaseType;
/// <summary>
/// 数据库类型
/// </summary>
public static DataBaseType DataBaseType
{
get
{
if (glo.DataBaseDerived == "")
{
SessionManager.CurrInstance.DbInitial();
}
return dataBaseType;
}
}
#region 使用web.config的配置方法
//private static DataBaseType baseType;
//public static DataBaseType BaseType
//{
// get
// {
// string strDbtype = ConfigHelper.GetConfigString("DataType");
// switch (strDbtype)
// {
// case "MYSQL":
// baseType=DataBaseType.MySql;
// break;
// case "SQLSERVER":
// baseType=DataBaseType.SqlServer;
// break;
// case "ORACLE":
// baseType=DataBaseType.Oracle;
// break;
// }
// return baseType;
// }
//}
#endregion
}