IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MSSQL → 通用數(shù)據(jù)庫(kù)操作

通用數(shù)據(jù)庫(kù)操作

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

  一個(gè)系統(tǒng)執(zhí)行一個(gè)數(shù)據(jù)操作的步驟:

  1.連接數(shù)據(jù)庫(kù)。

  2.構(gòu)建Sql 語(yǔ)句。

  3.執(zhí)行語(yǔ)句。

  4.返回 執(zhí)行結(jié)果。

  注:

  一個(gè)系統(tǒng)可能有 N 個(gè)操作 ,然后另一個(gè)系統(tǒng)也要執(zhí)行數(shù)據(jù)訪問(wèn)操作,那么我們可以不可以把連接數(shù)據(jù)、庫(kù)執(zhí)行語(yǔ)句、返回結(jié)果

  寫成一個(gè)公共的東西呢? 答案是一定的。例如:NHibernate 我們只要引用它的類庫(kù)、配置數(shù)據(jù)庫(kù)連接語(yǔ)句和Mapping 文件 就可以

  進(jìn)行操作了。那我今天說(shuō)的是 不用寫配置文件 的一個(gè) 公用數(shù)據(jù)庫(kù)操作類庫(kù)。暫時(shí)只實(shí)現(xiàn)查詢

  首先我們編寫一個(gè)接口:

  IDataProvider

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
    public interface IDataProvider
    {
        DbConnection OpenConnection();
        void Open();
        void Close();
        IDataReader ExecuteReader(string sql);
        int ExecuteNonQuery(string sql);
        ICollection ExcuteReader(string sql) where TEntity : class;
    }
}

  DbConnection OpenConnection(); 打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接

  void Open(); 當(dāng)連接為關(guān)閉狀態(tài)時(shí) 再次打開(kāi)連接

  void Close(); 關(guān)閉連接

  IDataReader ExecuteReader(string sql); 執(zhí)行Sql 語(yǔ)句返回執(zhí)行結(jié)果

  int ExecuteNonQuery(string sql); 執(zhí)行 修改、刪除、增加

  ICollection ExcuteReader(string sql) where TEntity : class;  執(zhí)行查詢返回對(duì)象集合

  然后為接口寫一個(gè)抽象類:

  DataProviderBase

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using CustomDataOperate.Data.Translates;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
    public abstract class DataProviderBase : IDataProvider
    {
        protected DbConnection _Connection;
        protected DbCommand _Command;
        protected IEntityTranslate _Translate;
        #region IDataProvider Members
        public abstract DbConnection OpenConnection();
        public virtual void Close()
        {
            _Connection.Close();
        }
        public virtual void Open()
        {
            _Connection.Open();
        }

        protected virtual DbCommand Command
        {
            get { return _Command; }
            set { _Command = value; }
        }

        protected IEntityTranslate Translate
        {
            get
            {
                if (_Translate == null)
                {
                    _Translate = new EntityTranslate();
                }
                return _Translate;
            }
        }
        public abstract IDataReader ExecuteReader(string sql);
        public abstract int ExecuteNonQuery(string sql);

    public abstract ICollection ExcuteReader(string sql) where TEntity : class;
        #endregion
    }

?

  在 DataProviderBase 中出現(xiàn)了 Translate 屬性 他是什么呢 ? 他是一個(gè) (IEntityTranslate) 轉(zhuǎn)換器

  將IDataReader 轉(zhuǎn)換為Entity

  代碼如下:

  IEntityTranslate

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CustomDataOperate.Data.Translates
{
    public interface IEntityTranslate
    {
        TEntity Translate(IDataReader reader) where TEntity : class;
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MD = CustomDataOperate.Data.Attributes;
using System.Reflection;
namespace CustomDataOperate.Data.Translates
{
    public class EntityTranslate:IEntityTranslate
    {
        public TEntity Translate(IDataReader reader) where TEntity : class
        {
            Type entityType = typeof(TEntity);
            object entity = Activator.CreateInstance(entityType);
            foreach (PropertyInfo info in entityType.GetProperties())
            {
                string columnName = string.Empty;
                object[] attributes = info.GetCustomAttributes(true);
                foreach (object attribute in attributes)
                {
                    if (attribute is MD.DataColumn)
                    {
                        columnName = (attribute as MD.DataColumn).ColumnName;
                        int filedIndex = 0;
                        while (filedIndex < reader.FieldCount)
                        {
                            if (reader.GetName(filedIndex) == columnName)
                            {
                                info.SetValue(entity, reader.GetValue(filedIndex), null);
                                break;
                            }
                            filedIndex++;
                        }
                        break;
                    }
                }
            }
            return entity as TEntity;
        }
    }
}

  為什么轉(zhuǎn)換器中會(huì)出現(xiàn) DataColumn 是 System.Data 命名空間下的嗎? 不是 這是一個(gè)自定義的 Attirbute

  DataColumn

using System;
using System.Collections.Generic;
using System.Text;
namespace CustomDataOperate.Data.Attributes
{
    public class DataColumn : System.Attribute
    {
        public DataColumn()
        {
        }
        public DataColumn(string columnName)
        {
            ColumnName = columnName;
        }
        public string ColumnName
        {
            get;
            set;
        }
    }
}

  注釋:

  ColumnName :將數(shù)據(jù)庫(kù)的Filed 和 Entity Property 對(duì)應(yīng)。

  到這里還要做什么呢? 對(duì)了還缺少實(shí)現(xiàn),那么我們開(kāi)始實(shí)現(xiàn)這個(gè) Provider

  SqlDataProvider

using System;
using System.Collections.Generic;
using System.Text;
using CustomDataOperate.Data.DataProviders;
using System.Da

關(guān)鍵詞標(biāo)簽:數(shù)據(jù)庫(kù)

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法