虽然NHibernate是完全OO的,但我们还是有需要返回DataSet的时候。
在ADO.NET里,要返回DataSet需要使用IDbDataAdapter, 那么通过NHibernate返回DataSet的关键就是如何创建合适的IDbDataAdapter实现类。
在NHibernate里,由IDriver负责创建Connection和Command,我们可以扩展相应的Driver使其能创建DataAdapter,对于SqlClientDriver的扩展类如下:
public class ExSqlClientDriver : SqlClientDriver
{
public IDbDataAdapter CreateDataAdapter()
{
return new SqlDataAdapter();
}
}
对应的配置更改如下:
<property name="connection.driver_class">Chapter01.ExSqlClientDriver, Chapter01</property>
主调用代码:
// 初始化
Configuration cfg = new Configuration().Configure();
ISessionFactory sf = cfg.BuildSessionFactory();
// 得到扩展的Driver
ExSqlClientDriver driver = (ExSqlClientDriver)sf.ConnectionProvider.Driver;
// 打开数据库连接
IDbConnection conn = ((ISessionFactoryImplementor)sf).OpenConnection();
// 创建Command
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from infos";
DataSet ds = new DataSet();
// 创建DataAdapter
IDbDataAdapter da = driver.CreateDataAdapter();
da.SelectCommand = cmd;
// 填充Dataset
da.Fill(ds);