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, 到现在为止,所有基础类就讲完了,大家可创建一个表来实现下看,看到底是否【为所欲为】!

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

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

原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua2.html