Informax.SqlCenter跨数据库平台(二)--数据库控制
在Informax.SqlCenter中所有与数据库之间的交互全部集成到了PersistBroker中,主要包括连接控制,事务控制,查询控制等功能,考虑到兼容性和可移植性当然也有一些接口没有向外部提供,而只有在进行扩展继承的情况下才可以使用。
对象的创建使用创建工厂的方法对于每种数据库使用不同的控制类,并且向外部提供相同的接口,由于使用了模版模式在扩展继承的时候只需要实现其中的少数几个比较关键的方法即可。由于在大中型数据库中可以使用Multi Sessions and Multi Transaction的功能,所以在对象实例化的时候没有采用连接池的模式,可能这一点对于初学者可能是比较难以理解的。
下面主要介绍几种与数据库交互的接口:
对象的创建使用创建工厂的方法对于每种数据库使用不同的控制类,并且向外部提供相同的接口,由于使用了模版模式在扩展继承的时候只需要实现其中的少数几个比较关键的方法即可。由于在大中型数据库中可以使用Multi Sessions and Multi Transaction的功能,所以在对象实例化的时候没有采用连接池的模式,可能这一点对于初学者可能是比较难以理解的。
下面主要介绍几种与数据库交互的接口:
- 实例化方法:
在创建对象的时候提供了三个Instance接口,他们分别是:
public static PersistBroker Instance(DBConnectionString connectionString)
public static PersistBroker Instance(DBConnectionString connectionString,string assemblyName,string typeName)
public static PersistBroker Instance(DBConnectionString connectionString,Type type)
第一个接口中只需要提供连接字符串数据实体即可,但是这个方法只能实例化当前已经内置的几种数据库支持(Sql Server 2000, Oracle, DB2, MySql5, InterBase);第二个接口需要提供三个参数,他们分别是连接字符串数据实体、包含数据库控制实体的程序集名称、数据库控制实体的全名称,这个方法主要用在使用扩展数据库驱动的情况下实例化当前程序集外的对象;第三个接口与第二个接口的作用相同,只是第二个参数为数据库控制实体的类型对象。 - 数据库连接控制:
在这里提供了一个protected的Open方法,只有在进行继承的情况下才能使用。因此在进行数据库增删改插等操作的时候会自动打开到数据库的连接,而不需要在外部声名打开数据库连接的操作。而关闭数据库操作的方法提供了两个接口
public void Close()
public void Close(bool BeginGC)
第一个接口仅仅是关闭到数据库的连接而仍然保持当然对象的所有状态;第二个接口在关闭数据库连接的同时需要强制进行垃圾回收以释放占用的资源,这个方法对于频繁更换数据库连接目标的情况下还是会节省很多内存资源的,但是会在一定程度上造成程序运行速度的降低。因此推荐使用第一个关闭数据库连接的方法,而且在每次使用完毕之后进行关闭数据库连接的操作,而不是等待服务器的自动处理。 - 事务控制:
在对事务进行控制的时候提供了BeginTrans(开始事务),CommitTrans(提交事务)和RollBackTrans(回滚事务)三个方法。在这三个方法执行的同时会触发三个事件TransactionBegin, TransactionCommit, TransactionRollBack,主要是用于在对同一个事务的处理过程中在不同的方法和控制类中发出事务控制状态变化通知。最常用的使用方法如下面的代码:
SqlServerConnectionString connStr=new SqlServerConnectionString("localhost","Northwind");
PersistBroker broker=PersistBroker.Instance();
broker.BeginTrans();
try
{
// do something to modify database
broker.CommitTrans();
}
catch(Exception ex)
{
broker.RollBackTrans();
throw ex;
}
当然开始事务的声名可以放到try的过程中去,由于在开始事务的同时会确认到数据库的连接已经打开,如果处于关闭状态会自行打开到数据库的连接。因此在大部分情况开始事务的操作不会出现异常。 - 查询控制接口:
以上提到的三种接口基本上都是为了进行正常的查询控制而服务,同时也保证了数据的完整性和核数据读写的正确性。在查询控制中分为选择查询和修改查询两种,并且为这两种查询分别提供了不同的接口:
在进行修改查询时主要使用
public bool ExecuteNonQuery(ISqlEntity sqlInfo)
在这个方法中可以根据不同的数据库类型对查询实体进行适应性的处理后交给数据库去进行对数据的控制,因此使用这个方法可以保证安全性和兼容性,但是会丧失很多的灵活性。与此同时提供了直接执行查询字符串的方法
public bool ExecuteNonQuery(string Sql)
在使用的参数为标准的Sql-92查询的情况下,通过这个方法可以保证灵活性但不能保证安全性,因此只有在保证完全安全的查询的情况下才可以使用这种方法。另外由于不能保证参数Sql-92标准化,因此可能会出现不能进行数据库移植的现象,所以不推荐使用这种方法。
另外为了支持存储过程和参数查询的使用提供了接口
public bool ExecuteNonQuery(string Sql, CommandType sqlType, string[] sqlParams, object[] paramValues)
上面提到的三种接口的返回值均为执行的成败结果(大部分情况下为true, 如果失败一般会出现抛出异常)。
同样针对选择查询的操作也提供了三个关键接口
public DataSet QueryExecute(ISqlEntity sqlInfo)
public DataSet QueryExecute(string Sql)
public DataSet QueryExecute(string Sql, CommandType sqlType, string[] sqlParams, object[] paramValues)
返回值为查询结果集,如果出现错误同样会抛出异常。以上两种查询操作在默认情况下都是在ReadCommitted的事务级别的基础上进行的。
posted on 2005-06-13 22:11 Edward.Net 阅读(493) 评论(0) 收藏 举报