菜鸟阿鹏编程记

代码在歌唱(脚踏实地的初学者)
随笔 - 61, 文章 - 0, 评论 - 135, 引用 - 0
数据加载中……

小菜梦游Discuz!NT (第九篇 数据层设计5)

上回说到,各种数据库的差异比较明显.

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), falsetrue));
                    }

                    
catch