WinForm如何简单地做到支持多数据库
首先我们定义一个数据库操作类接口,这里我定义为DBManager.cs,接口内我定义了一般意义上会涉及到的数据库操作:
public interface DBManager
{
/// <summary>
/// 执行简单SQL语句,返回datatable
/// </summary>
/// <param name="sqlstr"></param>
/// <returns></returns>
DataTable dosql(string sqlstr);
/// <summary>
/// 执行简单SQL语句,返回受影响行数
/// </summary>
/// <param name="sqlstr"></param>
/// <returns></returns>
int Do_SQL(string sqlstr);
/// <summary>
/// 执行更新操作,使用参数化SQL语句,返回受影响行数
/// </summary>
/// <param name="tablename">表名</param>
/// <param name="dicvalue">Set语句部分</param>
/// <param name="dickey">Where语句部分</param>
/// <returns></returns>
int Do_Update(string tablename, Dictionary<string, object> dicvalue, Dictionary<string, object> dickey = null);
/// <summary>
/// 执行参数化插入语句,返回受影响行数
/// </summary>
/// <param name="tablename">表名</param>
/// <param name="dicvalue">插入的键值对</param>
/// <returns></returns>
int Do_Insert(string tablename,Dictionary<string,object> dicvalue);
/// <summary>
/// 执行参数化删除语句,返回受影响行数
/// </summary>
/// <param name="tablename"></param>
/// <param name="dickey"></param>
/// <returns></returns>
int Do_Delete(string tablename,Dictionary<string,object> dickey);
}
这个接口的用处在于,我们可以为每一种数据库类型建立一个继承此接口的操作类,并实现接口内的方法.如为SQL写一个SQLHelper,为Oracle写一个OracleHelper,在这里我们先记下我们实现这两个类,具体代码就不再一一赘述,
/// <summary>
/// SQL数据库操作类
/// </summary>
public class SQLHelper: DBManager{.......}
/// <summary>
/// Oracle数据库操作类
/// </summary>
public class OracleHelper: DBManager{.....}
接着我们需要简单地使用工厂模式,创建数据库接口工厂IDbFactory:
public interface IDbFactory
{
DBManager createDbmanager();
}
下一步是创建工厂类实现工厂接口:
public class DBFactory:IDbFactory
{
public DBManager createDbmanager()
{
string DBtype = ConfigHelper.GetAppConfig("Dbtype");//这里假设我们把数据库类型放在配置文件app.config里,configHelper是本人写的一个读取配置文件的工具类,请理解 ////这里是读取一个配置项即可
DBManager manager = null;
switch (DBtype)
{
//根据配置项的值创建不用的操作类示例
case "SQL":
manager= new SQLHelper();
break;
case "Oracle":
manager= new OracleHelper();
break;
default:
break;
}
return manager;
}
}
于是正常我们可以通过
IDbFactory factory = new DBFactory();
DBManager manager = factory.createDbmanager();
这两句代码实现调用,让系统根据配置来生成不同的数据库操作类,实现支持多数据库的效果.