zoukankan      html  css  js  c++  java
  • C#存取数据为所欲为(四)

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

             接着昨天的聊。

             上篇说到‘父亲’留下了点儿事情给‘儿子’去做,对,即使是‘儿子’去做,没有现代化‘工具’

    在现代社会哪那么容易,所以工欲善其事,必先利其器,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, 到现在为止,所有基础类就讲完了,大家可创建一个表来实现下看,看到底是否【为所欲为】!

    我将在下面一节,也是整个文章最后一节,来说明怎样做一个实例。

    今天就说到这里吧,,大家可随便发表看法,,方可共同进步啊!!呵呵。。。。

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua2.html
Copyright © 2011-2022 走看看