透过vs.net数据窗体向导看Ado.net

ado|数据

透过vs.net数据窗体向导看Ado.net

郑佐2005-1-1

在csdn上经常碰到有人问一些Ado.net的问题,特别是开发信息管理系统之类的跟数据库比较密切的程序时,在数据和界面层的开发中会遇到不少常见问题,下面我们通过vs.net自带的数据窗体向导来看看能它能帮我们决绝什么问题。

一.使用向导

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

整个程序的运行界面如下:

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

二.数据填充

先来看看数据集结构:

一个Categories表作为父表,Products表作为子表,CategoryID为外键,建立的数据表关系。

通过加载按钮数据库中的相关数据会被填充到数据集。执行的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();

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");

可见通过关系绑定数据相当方便。

四.数据浏览

这里通过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();

删除数据的代码如下:

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))

{

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 进行的所有更改。

七.补充

对于数据的更新需要视程序环境而定,不能都通过获取子集再合并的方法,具体请看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基类把什么都扑捉了,如果知道有可能会抛出什么类型的异常,还是越具体越好,造成的反面效果就是要写更多的代码。具体为什么要这么做可以看《Applied Microsoft.NET Framework Programming》一书。

时间: 2024-08-05 21:29:51

透过vs.net数据窗体向导看Ado.net的相关文章

VB.NET中“数据窗体向导”所生成的“添加”代码的改进

数据 在数据库应用程序开发中,我们知道数据操作的主要任务是:"浏览.编辑.删除.添加记录",利用VB.NET的"数据窗体向导"可以帮助我们迅速创建实现上述功能的Windows 窗体及相关代码,这种自动生成的代码完全具有实用性和可借鉴性.然而笔者在使用中发现,在"数据窗体向导"的操作过程中,如果我们选择的是"单个控件的单个记录"显示样式,假如控件绑定到的数据源中的字段又有不允许为Null值的话,运行自动生成的窗体,单击"

c# ado.net 前台用ajax传数据到后台 看图 大家觉得我后台怎么接收

问题描述 c# ado.net 前台用ajax传数据到后台 看图 大家觉得我后台怎么接收 并且放到数据库执行 执行成功 返回一个1 失败则是0 划红线都是文本框中已经获取的值 解决方案 Request.Params["pointJson"] http://blog.csdn.net/chinacsharper/article/details/9748639 解决方案二: http://www.cnblogs.com/ambar/archive/2010/07/13/parse-json

讲一讲ASP处理数据用的组件ADO (ActiveX Data Object)

active|activex|ado|object|数据 讲一讲ASP处理数据用的组件ADO (ActiveX Data Object)一. 字符串形式连接一个 Access库 <% set conn=server.createobject("ADODB.CONNECTION") path=server.MapPath("info.mdb") conn.open "provider=microsoft.jet.oledb.4.0; data sour

SQL Server Management Studio Express管理器 没有导入导出数据的向导的解决方法_mssql2005

办法如下: sqlserver2005中,导入导出数据是通过SQL Server 2005 Integration Services (SSIS)实现的,那么可以在SQL 2005的安装目录下找到DTSWizard.exe,例如我的是在C:\Program Files\Microsoft SQL Server\90\DTS\Binn,在该目录下找到DTSWizard.exe,然后在命令提示符窗口中运行DTSWizard.exe,这时候就可以看到导入导出数据的向导了. 接下来就可以进行导入导出操作

从数据仓库系统对比看Hive发展前景

本文讲的是从数据仓库系统对比看Hive发展前景,大数据时代的信息爆炸,使得分布式/并行处理变得如此重要.无论是传统行业,还是新兴行业(特别是互联网行业),日常业务运行所产生的海量用户和服务数据都需要更大的硬件资源来处理.需要并行处理的应用领域主要为网页搜索.广告投放和机器翻译等.从单机应用到集群应用的过渡中,诞生了MapReduce这样的分布式框架,简化了并行程序的开发,提供了水平扩展和容错能力. 虽然MapReduce(Hadoop)的应用非常广泛,但这类框架暴露出来的编程接口仍然比较低级,编

ajax返回xml数据问题(帮忙看一下)

问题描述 ajax返回xml数据问题(帮忙看一下) if (xhr.readyState == 4) { if (xhr.status == 200) { var myval=""; var myval=xhr.responseXML; var myvals=xhr.responseText; window.alert(myvals); var cons=myval.getElementsByTagName("content");//报错说:Uncaught Typ

学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

本文将简单介绍在Silverlight 2中如何调用ADO.NET Data Services. 准备知识 由于ADO.NET Data Services是在ASP.NET 3.5 Extensions中,所以在开始本文示例之前,首先要安装一下ASP.NET 3.5 Extensions最新版本,你可以从这里下载.安装完成后,在添加新项对话框中应该能够看到ADO.NET Data Service项: ADO.NET Data Service允许应用程序把数据以服务的形式公开,这样我们就可以通过浏

驱动智能制造的大数据,你看得懂吗?

中国制造正在悄然发生着积极变化. 一组来源于国家统计局的最新数据显示:2016年1-5月,规模以上工业增加值同比增长5.9%,工业总体保持平稳增长.同样,高新技术制造业和装备制造业增加值继续保持较快增长,占规模以上工业增加值的比重已分别达到12.1%和32.5%. 毫无疑问,"中国制造"已成为世界上认知度最高的标签之一.历经30多年的高速发展,作为促进世界经济发展的重要力量,中国这个"世界工厂"的角色已经越来越重要. 相伴而生的是,智能制造作为中国制造未来的重要方向

物联网数据中心大战 看美国科技巨头怎么布局

近年来物联网迎来爆炸式发展, 无论是苹果.谷歌(微博)还是英特尔.Facebook都开始在全球范围内兴建数据中心以更好的服务临近地区用户.许多科技消费者可能没有意识到,在他们每天使用的产品背后,一场激烈的战争正在持续展开. 物联网数据中心 苹果 苹果日前宣布在中国贵州省投入10亿美元建立其在中国境内的第一个数据中心,该公司表示这一数据中心将同云上贵州大数据产业发展有限公司(云上贵州)合作建立,主要是为了iCloud用户能够更加安全的存储照片.视频.文档.App和进行设备同步.苹果新建的数据中心将