主流数据库有,sqlserver,oralce,db2,mysql。
产品级的.net工作流系统必须要能支持这多种数据库,同时还需要能方便的扩展支持新的数据库。
在做数据库操作方面,java和.net的各不一样,java是利用jdbc的一套类库来做数据库的读写。但.net的就比较多了,微软提供的就有oledb,sqlclent,oracleClient,odbc等,还有一些第三方提供的访问类。
所以在做多数据库支持方面,.net工作流系统,就需要考虑这些方式都支持,并且能很容易的切换。
C#数据库多种访问方式类框图
首先按上面的类框图,设计好类接口关系。
DbProvider:为数据库类实现方式的接口,提供有打开数据库,关闭,启事务,事务回滚,事务提交等方法。
OleDbProvider:为oledb方式的连接数据库的实现类,实现DbProvider接口;
OracleDbProvider: 为oralceClient方式的连接数据库的实现类,实现DbProvider接口。
SqlDbProvider: 为SqlClient方式的连接数据库的实现类,实现DbProvider接口。
DbProviderFactory:负责创建具体的实现类,根据传入的参数来创建具体的数据库操作实现类。
Environment: 为需要获取数据库连接的类。
具体的数据库连接参数,在bin\fcconfig.xml文件中,fcconfig.xml文件如下:
第一个ds子节点为工作流系统的默认连接 (注:fcconfig.xml文件.net工作流系统和java工作流系统一致,只是具体的属性值设置不一样。)
type属性="sqlclient" 则为使用SqlDbProvider类创建的DbProvider。
type属性="oracleclient"则为使用OracleDbProvider类创建的DbProvider.
type属性="oledb"则为使用OleDbProvider类创建的DbProvider.
在对外的操作中屏蔽了sqlClient,OracleClient,oleDb等的差异。一个简单的使用实例如下:
Environment env = new Environment(Session);
DbProvider db = env.getDbProvider();
env.beginTransaction();
string sql="";
sql = "insert into wf_user(user_id,user_code,user_name,user_password,user_status) ";
sql +=" values('1','xx','xx','1','1')";
db.ExecuteNonQuery(sql);
sql ="select user_code,user_name from wf_user where user_id='1'" ;
System.Data.IDataReader ds = db.ExecuteSqlReader(sql);
if (ds.Read())
{
string usercode =(string)ds["user_code"];
string username1 =(string)ds["user_name"];
}
ds.Close();
sql ="delete from wf_user where user_id='1'" ;
db.ExecuteNonQuery(sql);
env.commitConnection();
env.closeConnection();
当如果没有写数据库操作时,则不需要env.beginTransaction();和 env.commitConnection();直接使用db就可以了。