星期六,补班。一回家先把一堆衣服洗了,手冻的不行但蛮有成就感的!
接着昨天的聊。
上篇说到‘父亲’留下了点儿事情给‘儿子’去做,对,即使是‘儿子’去做,没有现代化‘工具’
在现代社会哪那么容易,所以工欲善其事,必先利其器,OK,我们就先谈工具的做法。
今天要说的有两个关系到数据库的基础类,DataAccess ,TableDataAccess<T, U> 。
第一个类很简单,就是传入一个连接串,再生成连接就好了:
{
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,看看具体实现:
where T : TableItem
where U : TableCollection<T>
{}
这个抽象类所做的事情就是 取数据和存数据,其实,它本身也只是对数据集的整理,真正的实现还是子类。
我们看下这么去取数据:
{
// 清空已经存在的数据
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()
看看前面讲过的就明白了,就不再啰嗦了。
再看另外一个方法,存数据:
{
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 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, 到现在为止,所有基础类就讲完了,大家可创建一个表来实现下看,看到底是否【为所欲为】!
我将在下面一节,也是整个文章最后一节,来说明怎样做一个实例。
今天就说到这里吧,,大家可随便发表看法,,方可共同进步啊!!呵呵。。。。