• 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# WinForm 取消DataGridView的默认选中Cell 使其不反蓝
    我们 成就了每个我的世界
    [转]firefox与IE的事件处理
    C# WinForm CheckedListBox 使用的相关简单总结
    [书目20090216]高绩效人士的五项管理 李践作品
    [转]asp.net导出Excel/Csv格式数据最优方案(C#)
    [文摘20090201]男女朋友~~需记住亦舒的77句话
    WML 参考手册
    [引]ASP.NET 移动网页 与 如何:使用仿真程序和浏览器在部署移动 Web 应用程序之前对其进行测试
    [文摘20090203]3G知识入门讲座
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua2.html
Copyright © 2020-2023  润新知