网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > ADO.NET > 透过VS.NET数据窗体向导看ADO.NET  

透过VS.NET数据窗体向导看ADO.NET

2005-01-05  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  一.使用向导
  新建Windows 应用程序,为当前项目添加组件,选择数据窗体向导,这里名称填写为DataForm1.cs。单击打开出现数据窗体向导对话框。创建新的类型化数据集MyDataSet。使用本地数据连接向导,这里我选择Northwind库作为数据源。在选择表或视图那一步添加Categories表和Products表。添加一个表之间的关系取名CategoryProductRel。在选择显示样式一步中选择显示数据的方式为单个控件中的单个记录,这个就会有数据绑定到文本框。可以用数据导航来选择父表的记录。向导完成后会生成一个OleDbConnection,几个表生成几个OleDbDataAdapter负责数据的获取和更新。另外就是一个强类型的数据集。
  
  整个程序的运行界面如下:
  
 

  基本功能都包括了,不过等你点击几下,程序界面上就会出现小的bug,微软可能也估计到没有人会要这个窗体来处理数据,不过这个不是我们所关心的。
  
  二.数据填充
  先来看看数据集结构:
  

  一个Categories表作为父表,Products表作为子表,CategoryID为外键,建立的数据表关系。 网管下载dl.bitscn.com
  
  通过加载按钮数据库中的相关数据会被填充到数据集。执行的LoadDataSet()方法的过程如下:
  
  使用DataAdatpter.Fill()方法填充数据到临时的一个数据集,如果操作成功,将合并这个临时数据集到原有的数据集,DataGrid通过表关系绑定子表。
  
  // 尝试填充临时数据集。
  
  this.FillDataSet(objDataSetTemp);
  
  grdProducts.DataSource = null;
  
  // 清空数据集中的旧记录。
  
  objMyDataSet.Clear();
  
  // 将记录合并到主数据集中。
  
  objMyDataSet.Merge(objDataSetTemp);
  
  grdProducts.SetDataBinding(objMyDataSet, "Categories.CategoryProductRel");
  
  在数据填充的方法中我们注意到
  
  dataSet.EnforceConstraints = false;
  
  这一步会对数据填充效率会有所提高。
  
  另外还有一个细节就是执行两个以上DataAdapter的数据访问方法时显式打开关闭数据连接效率会比较高。因为在执行DataAdapter的数据更新方法前和方法后数据连接Connection实例的状态不会改变。如果下面代码。
  
  //this.oleDbConnection1.Open(); 网管联盟bitsCN@com
  
  this.oleDbDataAdapter1.Fill(dataSet);
  
  this.oleDbDataAdapter2.Fill(dataSet);
  
  执行之前Connection的状态是关闭的,那可想而知这一过程会执行两次打开连接关闭连接。
  
  其实一次就够。
  
  为了数据的严密性,填充完数据后不要忘了加上下面代码,
  
  // 重新打开约束检查。
  
  dataSet.EnforceConstraints = true;
  
  如果是直读那就无所谓了。
  
  有了数据填充那就来看数据的单值绑定和多值绑定。
  
  三.数据绑定
  数据的单值绑定如下:
  
  this.editCategoryID.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.objMyDataSet, "Categories.CategoryID"));
  
  this.editCategoryName.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.objMyDataSet, "Categories.CategoryName"));
  
  上面一段代码把数据表的列绑定到了TextBox的Text属性上。
  
  数据的多值绑定如下:
  
  grdProducts.SetDataBinding(objMyDataSet, "Categories.CategoryProductRel");
网管论坛bbs_bitsCN_com

  
  可见通过关系绑定数据相当方便。
  
  四.数据浏览
  这里通过BindingContext对象的索引得到BindingManagerBase实例,而BindingManagerBase.Position就是我们需要的,通过Position来显示某一行的数据记录。
  
  例如下一条:
  
  this.BindingContext[objMyDataSet,"Categories"].Position = (this.BindingContext[objMyDataSet,"Categories"].Position + 1);
  
  最后一条:
  
  this.BindingContext[objMyDataSet,"Categories"].Position = (this.objMyDataSet.Tables["Categories"].Rows.Count - 1);
  
  另外调用PositionChanged()方法来改变导航按钮之间的索引显示。
  
  五.数据编辑
  从添加方法中我们可以看到下面代码:
  
  // 清除当前编辑内容
  
  this.BindingContext[objMyDataSet,"Categories"].EndCurrentEdit();
  
  经常有人在csdn上提问为什么在编辑DataGrid或TextBox的时候,只有当编辑框失去焦点的时候才会被保存。要实现不改变焦点就保存可以通过上面代码实现。
  
  相对应的取消如下:
  
  this.BindingContext[objMyDataSet,"Categories"].CancelCurrentEdit();
网管网www_bitscn_com

  
  删除数据的代码如下:
  
  this.BindingContext[objMyDataSet,"Categories"].RemoveAt(this.BindingContext[objMyDataSet,"Categories"].Position);
  
  看到上面代码发现原来数据不是真正的在数据源删除,不过我们开发的时候可能用的更多的是DataRow的Delete()方法,这样能够提交数据更新到数据源。
  
  六.数据更新
  向导生成的代码如下:
  
  public void UpdateDataSet()
  
  {
  
   // 创建一个新数据集来保存对主数据集所做的更改。
  
   WindowsApplication1.MyDataSet objDataSetChanges = new WindowsApplication1.MyDataSet();
  
   // 停止当前的任何编辑。
  
   this.BindingContext[objMyDataSet,"Categories"].EndCurrentEdit();
  
   this.BindingContext[objMyDataSet,"Products"].EndCurrentEdit();
  
   // 获取对主数据集所做的更改。
  
   objDataSetChanges = ((WindowsApplication1.MyDataSet)(objMyDataSet.GetChanges()));
  
   // 检查是否做了任何更改。
  
   if ((objDataSetChanges != null))

网管下载dl.bitscn.com


  
   {
  
     try
  
     {
       // 需要做一些更改,所以尝试通过调用 update 方法
  
       // 和传递数据集以及任何参数来更新数据源。
  
       this.UpdateDataSource(objDataSetChanges);
  
       objMyDataSet.Merge(objDataSetChanges);
  
       objMyDataSet.AcceptChanges();
  
     }
  
     catch (System.Exception eUpdate)
  
     {
  
       // 在此处添加错误处理代码。
  
       throw eUpdate;
  
     }
  
     // 添加代码以检查返回的数据集中是否有任何可能已被
  
     // 推入到行对象错误中的错误。
  
   }
  
  }
  
  更新过程很经典,通过获取修改过的数据集更新子集提交到数据源完成更新动作,接着合并子集到原有数据集,顺便提一下,合并的过程是基于数据表主键来判断的。通过调用DataSet.AcceptChanges()方法提交自加载此 DataSet 或上次调用 AcceptChanges 以来对 DataSet 进行的所有更改。对应的就是Data.RejectChanges();回滚自创建 DataSet 以来或上次调用 DataSet.AcceptChanges 以来对 DataSet 进行的所有更改。

中国网管联盟bitsCN.com


  
  
  
  七.补充
  
  对于数据的更新需要视程序环境而定,不能都通过获取子集再合并的方法,具体请看ADO.NET中的多数据表操作浅析—修改一文。也有人问起怎样实现这样的功能:在数据库中的某一个字段数据为0或1,而在程序显示上想让它显示为是或否,这里我认为最好不要在Sql语句上做文章,代替的方法就是使用Binding对象的Format 事件和Parse事件。Binding.Format 事件,当将某控件的属性绑定到某个数据值时发生。Binding.Parse 事件,在数据绑定控件的值更改时发生。还有可以通过BindingManagerBase.PositionChanged事件来设置各个按钮的状态。需要具体的例子可以看MSDN或《Ado.net Core Reference》一书。另外,使用Try{}catch (System.Exception ex){}还是要视情况而定,不能一味的全都通过Exception基类把什么都扑捉了,如果知道有可能会抛出什么类型的异常,还是越具体越好,造成的反面效果就是要写更多的代码。

TAGs数据   透过   方法   objMyDataSet   Categories   绑定   代码    
 上一篇:使用ADO.NET 和C# 处理BLOB 数据   下一篇:没有了
相关文章列表
透过VS.NET数据窗体向导看ADO.NET 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.使用ADO.NET 和C# 处理BLOB 数据
2.使用ADO封装类的数据库程序开发实例(上)
3.ADO.NET详细研究 -- DataReader终结篇
4.用Microsoft.net实现数据库事务(1)
5.使用 Ado.net 获取数据库架构信息
6.ADO.net中数据库连接方式
7.掌握ADO.NET的十个热门技巧
8.用Microsoft.net实现数据库事务(4)
9.透过VS.NET数据窗体向导看ADO.NET
10.如何对DataTable进行检索和排序
最新推荐文章:
1.如何对DataTable进行检索和排序
2.DOTNET:LINQ与ADO.NET 3.0的创新
3..Net PetShop4.0分布式数据库设计
4.实现DataList和Repeater控件的分页显示
5.用C#对ADO.NET数据库完成简单操作
6.在VisualC#中用ListView显示数据记录
7.掌握ADO.NET的十个热门技巧
8.关于DAO数据库编程的几点经验
9.使用ADO封装类的数据库程序开发实例(上)
10.ADO.NET:通向未来之桥
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的