欢迎投稿

今日深度:

打造自己的数据访问层一

打造自己的数据访问层一


项目开发中,大多数开发人员的核心工作就是如何对数据进行存储及访问。为了进行数据操作,我们首先得解决几个基本问题:

1、如何与一个数据库建立连接。

2、如何从数据库读取相应的数据。

3、如何对数据表进行增改操作。

.NET中,ADO.NET很方便的解决了上面三个问题,我们可以使用DbConnection进行连接,DataSet进行数据存储,DataAdapter进行数据更新。先看一段代码:

  1. //创建DbConnection对象连接数据库
  2. SqlConnection conn = new SqlConnection();
  3. conn.ConnectionString = "server=.;uid=sa;password=123456; database=DATA_BASE; max pool size=300;";
  4. //创建DataAdapter、Command对象,读取数据
  5. SqlDataAdapter da = new SqlDataAdapter();
  6. SqlCommand cmd = new SqlCommand();
  7. cmd.Connection = conn;
  8. cmd.CommandText = "SELECT * FROM TEST";
  9. da.SelectCommand = cmd;
  10. //创建DataSet对象,存储数据,建立与物理表的映射
  11. DataSet ds = new DataSet();
  12. da.Fill(ds, "TEST"); 

上述代码实现对数据库“DATA_BASE”中“TEST”表数据读取,并用DataSet时行存储。

既然读出了TEST表中的数据,接下来要解决的就是如何对TEST表进行增、删、改操作。

为实现增、删、改操作,需要为DataAdapter指定InsertCommand、DeleteCommand以及UpdateCommand,并为每个Command对象绑定参数:

  1. //新增数据  
  2. cmd = new SqlCommand();  
  3. cmd.Connection = conn;  
  4. cmd.CommandText = "INSERT INTO TEST (ID, NAME, VAL) VALUES (@ID, @NAME, @VAL)";  
  5. SqlParameter param = new SqlParameter("@ID"null);  
  6. param.SourceColumn = "ID";  
  7. cmd.Parameters.Add(param);  
  8. param = new SqlParameter("@NAME"null);  
  9. param.SourceColumn = "NAME";  
  10. cmd.Parameters.Add(param);  
  11. param = new SqlParameter("@VAL"null);  
  12. param.SourceColumn = "VAL";  
  13. cmd.Parameters.Add(param);  
  14. da.InsertCommand = cmd;  
  15.  
  16. //修改数据  
  17. cmd = new SqlCommand();  
  18. cmd.Connection = conn;  
  19. cmd.CommandText = "UPDATE TEST SET NAME = @NAME, VAL = @VAL WHERE ID = @ID";  
  20. param = new SqlParameter("@ID"null);  
  21. param.SourceColumn = "ID";  
  22. cmd.Parameters.Add(param);  
  23. param = new SqlParameter("@NAME"null);  
  24. param.SourceColumn = "NAME";  
  25. cmd.Parameters.Add(param);  
  26. param = new SqlParameter("@VAL"null);  
  27. param.SourceColumn = "VAL";  
  28. cmd.Parameters.Add(param);  
  29. da.UpdateCommand = cmd;  
  30.  
  31. //删除数据  
  32. cmd = new SqlCommand();  
  33. cmd.Connection = conn;cmd.CommandText = "DELETE FROM TEST WHERE ID = @ID";  
  34. param = new SqlParameter("@ID"null);  
  35. param.SourceColumn = "ID";  
  36. cmd.Parameters.Add(param);  
  37. da.DeleteCommand = cmd;  

完成准备工作后,利用DataTable进行数据操作:

  1. DataTable dt = ds.Tables["TEST"];  
  2. dt.PrimaryKey = new DataColumn[] { dt.Columns["ID"] };  
  3. dt.Rows.Add(new object[]{  
  4.     Guid.NewGuid().ToString(), string.Format("测试:{0}", DateTime.Now), string.Format("测试值:{0}", DateTime.Now)  
  5. });  
  6. DataRow dr = dt.Rows.Find("f8dc2c64-f51a-4e99-bde1-a20069b09c3a");  
  7. if (dr != null){  
  8.     dr["NAME"] = string.Format("测试修改:{0}", DateTime.Now);  
  9. }  
  10. dr = dt.Rows.Find("ed7d079b-81ec-4ba4-bf85-688621e495e7");  
  11. if (dr != null){      
  12. dr.Delete();  

最后调用DataAdapter的Update方法保存变更后的数据:

da.Update(ds, "TEST");

利用ADO.NET的上述方法,我们已经完成了对数据库的完整操作。

注:上述代码是利用DataAdapter对数据库进行读写的基本原理,非常重要,我们后面的改造都将以此作为依据。

虽然我们已经能完成对数据的操作,但现实际上还是存在很多问题:

1、我们只是对MSSql数据库进行操作,如果要对Oracle或MySql进行操作我们得定义新的Oracle或MySql数据对象,如果能由系统自动判断操作的数据库类型,我们就能省去对数据对象的关注。

2、我们做了太多的准备工作,我们只对一张表进行操作,如查我们要对多张表进行操作,参数又很多,实际上会产生大量的重复代码,我们得考虑消除这些代码。

对于上述问题,如果我们自己实现一个数据访问层,对ADO.NET对象进行封装,只关注实际的数据的操作,而不关注系统是如何与数据库进行连接、如何进行参数传递,那我们的需求就算基本满足了。

我们可以先进行假设,需要达成如下效果,以伪码的形式给出:

  1. 创建数据执行者:DataExecuter:execObj;    
  2. 创建数据映射对象:DataMapping map;    
  3. 由映射对象填充数据集:map.Fill(sqlText, "TEST", ds);    
  4. 设置映射对象更新命令:map.SetCommands(Insert | Update | Delete, ds);    
  5. DataTable进行实际增、删、改操作。    
  6. 数据执行者执行最后的变更操作:execObj.Update(ds);    

后面我将一步步看到上述假设是如何实现的。

www.htsjk.Com true http://www.htsjk.com/shujukujc/18826.html NewsArticle 打造自己的数据访问层一 项目开发中,大多数开发人员的核心工作就是如何对数据进行存储及访问。为了进行数据操作,我们首先得解决几个基本问题: 1、如何与一个数据库建立连接...
相关文章
    暂无相关文章
评论暂时关闭