Nhibernate操作原生SQL以及查询DataTable
2009-01-22 10:28
253 查看
Nhibernate[/b]操作原生SQL以及查询DataTable[/b]
[/b]
使用Nhibernate时我们很方便实现实体映射,但是如果遇到复杂查询则显得力不从心,这是我们可以利用Nhibernate来操作原生sql来查询到DataTable来实现我们复杂的查询及其它操作。以下实例已经过调试,现与大家分享。
/// <summary>
/// 执行ExecuteNonQuery
/// </summary>
/// <param name="sql"></param>
public void ExecuteNonQuery(string sql)
{
ISession session = null;
ITransaction transaction = null;
try
{
session = NHibernateHelper.GetCurrentSession();
transaction = session.BeginTransaction();
IDbCommand command = session.Connection.CreateCommand();
transaction.Enlist(command);//注意此处要把command添加到事物中
command.CommandText = sql;
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
if (transaction != null)
{
transaction.Rollback();
}
throw ex;
}
finally
{
if (session != null)
{
session.Close();
}
}
}
/// <summary>
/// 填充DataSet
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static DataSet ExecuteDataset(string sql)
{
ISession session = null;
DataSet ds = new DataSet();
try
{
session = NHibernateHelper.GetCurrentSession();
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)
{
Debug.Assert(false);
}
finally
{
if (session != null)
{
session.Close();
}
}
return ds;
}
/// <summary>
/// 填充DataSet(此方法亦可)
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet ExecuteDataset(string sql)
{
ISession session = null;
DataSet ds = new DataSet();
try
{
session = NHibernateHelper.GetCurrentSession();
IDbCommand command = session.Connection.CreateCommand();
command.CommandText = sql;
SqlDataAdapter da = new SqlDataAdapter(cmd as SqlCommand);
da.Fill(ds);
}
catch (Exception ex)
{
Debug.Assert(false);
}
finally
{
if (session != null)
{
session.Close();
}
}
return ds;
}
[/b]
使用Nhibernate时我们很方便实现实体映射,但是如果遇到复杂查询则显得力不从心,这是我们可以利用Nhibernate来操作原生sql来查询到DataTable来实现我们复杂的查询及其它操作。以下实例已经过调试,现与大家分享。
/// <summary>
/// 执行ExecuteNonQuery
/// </summary>
/// <param name="sql"></param>
public void ExecuteNonQuery(string sql)
{
ISession session = null;
ITransaction transaction = null;
try
{
session = NHibernateHelper.GetCurrentSession();
transaction = session.BeginTransaction();
IDbCommand command = session.Connection.CreateCommand();
transaction.Enlist(command);//注意此处要把command添加到事物中
command.CommandText = sql;
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
if (transaction != null)
{
transaction.Rollback();
}
throw ex;
}
finally
{
if (session != null)
{
session.Close();
}
}
}
/// <summary>
/// 填充DataSet
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static DataSet ExecuteDataset(string sql)
{
ISession session = null;
DataSet ds = new DataSet();
try
{
session = NHibernateHelper.GetCurrentSession();
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)
{
Debug.Assert(false);
}
finally
{
if (session != null)
{
session.Close();
}
}
return ds;
}
/// <summary>
/// 填充DataSet(此方法亦可)
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet ExecuteDataset(string sql)
{
ISession session = null;
DataSet ds = new DataSet();
try
{
session = NHibernateHelper.GetCurrentSession();
IDbCommand command = session.Connection.CreateCommand();
command.CommandText = sql;
SqlDataAdapter da = new SqlDataAdapter(cmd as SqlCommand);
da.Fill(ds);
}
catch (Exception ex)
{
Debug.Assert(false);
}
finally
{
if (session != null)
{
session.Close();
}
}
return ds;
}
相关文章推荐
- Nhibernate操作原生SQL以及查询DataTable
- NHibernate 操作原生SQL以及查询DataTable,DataSet
- Nhibernate操作原生SQL以及查询DataTable
- NHibernate原生SQL查询
- hibernate HQL查询以及原生SQL查询参数类型的区别
- Hibernate中使用原生的sql语句进行查询操作
- Linq查询在LinqToSql以及DataTable中的使用
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- spring boot使用原生sql分页查询以及两张表的内连接查询sql
- 10 CI where数据库操作 以及查询最后一次执行的sql语句
- MyBatis学习之SQL查询参数以及增删改操作
- Thinkphp原生的sql查询及执行操作
- 如何在ThinkPHP里面使用原生的SQL查询操作
- C#动态操作DataTable(新增行、列、查询行、列等)
- 不用SQL语句查询DataTable中的数据
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- sql查询一个班级中总共有多少人以及男女分别多少人
- java原生sql操作数据库
- Excel读写入数据库以及相关查询操作