C#存取資料為所欲為(四)

來源:互聯網
上載者:User

         星期六,補班。一回家先把一堆衣服洗了,手凍的不行但蠻有成就感的!

         接著昨天的聊。

         上篇說到‘父親’留下了點兒事情給‘兒子’去做,對,即使是‘兒子’去做,沒有現代化‘工具’

在現代社會哪那麼容易,所以工欲善其事,必先利其器,OK,我們就先談工具的做法。

         今天要說的有兩個關係到資料庫的基礎類,DataAccess ,TableDataAccess<T, U> 。

第一個類很簡單,就是傳入一個串連串,再產生串連就好了:

    public static class DataAccess
    {
        public static string ConnectionString;

        public static OracleConnection  GetConnection()
        {
            if (ConnectionString == null)
            {
                throw new ApplicationException("請提供一個資料庫連接字串");
            }
            return new OracleConnection(ConnectionString);
        }
    }

 

當然這樣的 DATAACCESS類寫法非常多,可按照自己的習慣去寫,例如可用單件模式去實現等  》》》,這個

類就說到這裡。

         下面來說較為難的一種,TableDataAccess<T, U> ,為一個泛型類,其中,T 被約束為 TableItem,

U被約束為TableCollection<T>【T為TableItem】,不熟悉泛型和泛型約束的朋友可參考其他資料,我這裡

就不談了,OK,看看具體實現:

 

    public abstract class TableDataAccess<T, U>
        where T : TableItem
        where U : TableCollection<T>
    {}

 

這個抽象類別所做的事情就是 取資料和存資料,其實,它本身也只是對資料集的整理,真正的實現還是子類。

我們看下這麼去取資料:

 

        public void GetData(U data)
        {
            // 清空已經存在的資料
            data.Clear();
//我這裡以ORACLE為例,SQLSVR的話當然就是 SqlDataReader了,以下一樣。
            // 獲得資料閱讀器.
            OracleDataReader reader = GetReader();
            while (reader.Read())
            {
                T item = GetItemFromReader(reader);
                data.Add(item);
            }
            data.AcceptChanges();
            reader.Close();
        }

就是把取出來的資料添加到 tablecollection 中,這個tablecollection就是實體物件了,是在使用者端實現的,然後

使用者端把這個實體中的資料再存入資料庫中,這是以後講執行個體的時候要講到的問題。至於data.AcceptChanges()

看看前面講過的就明白了,就不再囉嗦了。

          再看另外一個方法,存資料:

 

        public void SaveData(U data)
        {
            OracleConnection conn = DataAccess.GetConnection();
            conn.Open();

            // 將每條資料分類,是新增,是刪除,還是修改
            foreach (T item in data.AllItems())
            {
                OracleCommand cmd = null;
                if (item.IsDeleted && !item.IsNew)
                {
                    cmd = GetDeleteCommand(item, conn);
                }
                else if (item.IsNew && !item.IsDeleted)
                {
                    cmd = GetInsertCommand(item, conn);
                }
                else if (item.IsDirty)
                {
                    cmd = GetUpdateCommand(item, conn);
                }

                if (cmd != null)
                {
                    cmd.ExecuteNonQuery();
                }
            }
            conn.Close();
        }

 

說到這裡,奇怪的是,其中幾個GetxxxCommand(item,conn)在哪兒實現呢?毋庸置疑,當然是在子類了:

 

        protected abstract OracleDataReader GetReader();

        protected abstract T GetItemFromReader(OracleDataReader reader);

        protected abstract OracleCommand GetUpdateCommand(T item, OracleConnection conn);

        protected abstract OracleCommand GetInsertCommand(T item, OracleConnection conn);

        protected abstract OracleCommand GetDeleteCommand(T item, OracleConnection conn);

 

這應該是目前開發方式中的基本原則吧---設計與實現分離。

當然了,也可用介面(interface)來實現隔離,讀者不妨試試看看,我也來做做,到時候一起來看看,O(∩_∩)O哈哈~

         OK, 到現在為止,所有基礎類就講完了,大家可建立一個表來實現下看,看到底是否【為所欲為】!

我將在下面一節,也是整個文章最後一節,來說明怎樣做一個執行個體。

今天就說到這裡吧,,大家可隨便發表看法,,方可共同進步啊!!呵呵。。。。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.