上回说到,各种数据库的差异比较明显.
Access和MySql不支持存储过程,Sql支持
Access和MySql不支持数据库备份,Sql支持
Access和Sql不支持优化,MySql支持
Access和MySql不支持全文搜索,Sql支持
等等,,数据库之前的差异,那么我们为何不顺水推舟呢.把DbHelper中的switch(数据库类型){....}这个毒瘤一块干掉呢.
这样就能更好的改造我们的DbHelper

小菜的设计登场了.
数据库驱动接口
using System;
using System.Data.Common;

namespace Discuz.Data


{
public interface IDbProvider

{

/**//// <summary>
/// 返回DbProviderFactory实例
/// </summary>
/// <returns></returns>
DbProviderFactory Instance();


/**//// <summary>
/// 是否支持全文搜索
/// </summary>
/// <returns></returns>
bool IsFullTextSearchEnabled();


/**//// <summary>
/// 是否支持压缩数据库
/// </summary>
/// <returns></returns>
bool IsCompactDatabase();


/**//// <summary>
/// 是否支持备份数据库
/// </summary>
/// <returns></returns>
bool IsBackupDatabase();


/**//// <summary>
/// 返回刚插入记录的自增ID值, 如不支持则为""
/// </summary>
/// <returns></returns>
string GetLastIdSql();


/**//// <summary>
/// 是否支持数据库优化
/// </summary>
/// <returns></returns>
bool IsDbOptimize();


/**//// <summary>
/// 是否支持数据库收缩
/// </summary>
/// <returns></returns>
bool IsShrinkData();


/**//// <summary>
/// 是否支持存储过程
/// </summary>
/// <returns></returns>
bool IsStoreProc();
}
}

Access数据库驱动
using System;
using System.Data.Common;
using System.Data.OleDb;

namespace Discuz.Data


{
public class AccessProvider : IDbProvider

{

/**//// <summary>
/// 返回DbProviderFactory实例
/// </summary>
/// <returns></returns>
public DbProviderFactory Instance()

{
return OleDbFactory.Instance;
}


/**//// <summary>
/// 是否支持全文搜索
/// </summary>
/// <returns></returns>
public bool IsFullTextSearchEnabled()

{
return false;
}


/**//// <summary>
/// 是否支持压缩数据库
/// </summary>
/// <returns></returns>
public bool IsCompactDatabase()

{
return false;
}


/**//// <summary>
/// 是否支持备份数据库
/// </summary>
/// <returns></returns>
public bool IsBackupDatabase()

{
return false;
}


/**//// <summary>
/// 返回刚插入记录的自增ID值, 如不支持则为""
/// </summary>
/// <returns></returns>
public string GetLastIdSql()

{
return "SELECT @@IDENTITY";
}


/**//// <summary>
/// 是否支持数据库优化
/// </summary>
/// <returns></returns>
public bool IsDbOptimize()

{

return false;
}


/**//// <summary>
/// 是否支持数据库收缩
/// </summary>
/// <returns></returns>
public bool IsShrinkData()

{
return false;
}


/**//// <summary>
/// 是否支持存储过程
/// </summary>
/// <returns></returns>
public bool IsStoreProc()

{

return false;
}
}
}

SqlServer数据库驱动
using System;
using System.Data.Common;
using System.Data.SqlClient;

namespace Discuz.Data


{
public class SqlServerProvider : IDbProvider

{

/**//// <summary>
/// 返回DbProviderFactory实例
/// </summary>
/// <returns></returns>
public DbProviderFactory Instance()

{
return SqlClientFactory.Instance;
}


/**//// <summary>
/// 是否支持全文搜索
/// </summary>
/// <returns></returns>
public bool IsFullTextSearchEnabled()

{
return true;
}


/**//// <summary>
/// 是否支持压缩数据库
/// </summary>
/// <returns></returns>
public bool IsCompactDatabase()

{
return true;
}


/**//// <summary>
/// 是否支持备份数据库
/// </summary>
/// <returns></returns>
public bool IsBackupDatabase()

{
return true;
}


/**//// <summary>
/// 返回刚插入记录的自增ID值, 如不支持则为""
/// </summary>
/// <returns></returns>
public string GetLastIdSql()

{
return "SELECT SCOPE_IDENTITY()";
}


/**//// <summary>
/// 是否支持数据库优化
/// </summary>
/// <returns></returns>
public bool IsDbOptimize()

{

return false;
}


/**//// <summary>
/// 是否支持数据库收缩
/// </summary>
/// <returns></returns>
public bool IsShrinkData()

{
return true;
}


/**//// <summary>
/// 是否支持存储过程
/// </summary>
/// <returns></returns>
public bool IsStoreProc()

{

return true;
}
}
}

那我们开始改进DbHelper吧.
using System;
using System.Web;
using System.Data;
using System.Data.Common;
using Discuz.Config;

namespace Discuz.Data


{
public abstract class DbHelper

{
private static string m_connString = BaseConfigFileManager.GetDbConnectString; //数据库连接串
private static DbProviderFactory m_factory = null; //DbProviderFactory实例
private static IDbProvider m_provider = null; //数据库驱动接口


/**//// <summary>
/// IDbProvider接口
/// </summary>
public static IDbProvider Provider

{
get

{
if (m_provider == null)

{
try

{
m_provider = (IDbProvider)Activator.CreateInstance(Type.GetType(string.Format("Discuz.Data.{0}Provider, Discuz.Data.{0}", BaseConfigFileManager.GetDbType), false, true));
}
catch
