分享
 
 
 

ADO.NET学习笔记(三)

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

(由于书上的代码全是用C#写的,转换为VB.NET实在麻烦,以后就不转换了,见谅)

五、操纵dataset

在DataSet中DataRow是其所有数据的基本存放位置,它主要是由一个值数组组成,代表DataTable单独一行。

DataRow中主要包括一下几种信息:1、行中每一列的当前值,2、行中每一列的原始值,3、行状态,4、父行与子行间的链接

初始化一个DataRow:

DataTable dataTable=dataSet.Tables[0];

DataRow newRow=dataTable.NewRow(); //用dataTable生成DataRow可以利用dataTable里面的模式

dataTable.Rows.Add(newRow);

删除行:

DataTable.Rows.Remove(行实例);

DataTable.Rows.RemoveAt(行号);

DataRow.Delete(); //行自身移除

读写DataRow的值:

row["列名"],row[列号]均可引用其中的一个属性

DataColumn a=dataTable.Columns("列名"); //可以获得一个列

对行进行批处理更改:

BeginEdit()开始更改,EndEdit()结束更改,同时将更改结果写入DataSet,CancelEdit(),取消更改

例如:

row.BeginEdit();

对row进行更改

row.EndEdit();

将数据批量加载到DataTable

dataTable.BeginLoadData();

dataTable.LoadDataRow(row1,false); //第二个参数为true时,调用dataTable.AcceptChanges()时接受更改,为false直接添加

……

dataTable.EndLoadData();

使用这种数据加载方式可以在数据加载期间屏蔽所有的数据约束,索引也不会予以维护,极大的加快了数据加载速度

行的版本:

current:当前值

default:根据操作的不同决定行的default值

original:最后一次调用AcceptChanges()之后的值

proposed:调用AcceptChanges()之前被更改的值

例如要获得行的original值:

String oldString=row("FirstName",DataRowVersion.original);

行的状态:

row.RowState获得行的状态,例如删除后变成Deleted,数据存储更新后变为unchanged

六、DataSet导航

在ADO.NET中每个表都保持其相对独立性,允许在行级上导航不同表之间的相关行(向下导航到子行,向上导航的父行)

如DataRow[] invoiceRows=custRow.GetChildRows("Customer_invoice"); //通过关系导航到子行

七、DataView

DataView就时数据视图,为数据库结构提供了外模式的实现。

同时DataView也可以为窗体控件和Web控件提供数据绑定功能,在每一个DataTable中内建了一个DataView为:DataTable.DefaultView();

创建DataView

DataView sortedView=new DataView(dataTable);

对DataView进行排序

dataTable.DefaultView.sort="lastName";

dataTable.DefaultView.sort="lastName,FirstName DESC";

对DataView进行筛选:

1、通过对其中的RowFilter属性设置可以实现筛选

dataTable.DefaultView.RowFilter="Vendor='Rawlings'";

不过筛选表达式只能设置成比较简单的表达式,功能有限,不过可以满足基本的要求。

同样在DataTable里面也可以进行简单的搜索,返回一个DataRow数组,例:

DataRow[] compoundRows=dataTable.select("Vendor='wilson' AND price>20.00)

2、通过RowState来筛选

dataTable.DefaultView.RowStateFilter="DataViewRowState.originalRows"可以筛选出符合要求状态的row

对DataView进行搜索:

相对于DataView使用RowFilter进行筛选得到一个矩形数据集,使用Find、FindRows可以更准确的查找到与特定键相匹配的行

搜索的时候必须首先设置DataView的sort属性:

int found=dataTable.DefaultView.Find("wilson"); //获得行的位置

DataRowView[] rows=dataTable.DefaultView.FindRows("Rawlings") //过得一个row数组

八、更新DB

在DataSet中,每一个DataTable对应着一个DataAdapter,DataAdapter.Update()时,DataTable自动更新。

更新的时候可以使用CommandBuilder自动根据DataSet的变化生成更新的SQL命令

SqlCommandBuilder bldr=new SqlCommandBuilder(dataAdapter);

dataAdapter.Update(custTable);

不过Update接受DataSet参数并不更新DataSet而是更新DataSet中的一个叫"Table"的表

使用CommandBuilder进行更新的时候要注意一下几点:

1、SelectCommand必须有效

2、必须有主码

3、若SelectCommand填充DataTable后架构发生改变,应该在Update()之前调用CommandBuilder.RefreshSchema();

4、更新DB时不受关系、约束或者DataSet中其他表的影响

虽然使用CommandBuilder比较方便,不用自己写更新命令,但自动生成的命令性能不高,这时可以考虑自己编写存储过程或直接使用带参数的sql语句,例如:

String insQry="Insert into Customer(CustomerID) Values (@Customer)";

SqlCommand insCmd=conn.CreateCommand();

insCmd.CommandText=insQry;

SqlParameterCollection insParams=insCmd.Parameters;

insParams.Add("@CustomerID",SqlDbType.UniqueIdentifier,0,"CustomerID");

dataAdapter.InsertCommand=insCmd;

dataAdapter.Update();

在dataAdapter.Update()更新时还可以控制更新的范围:

dataAdapter.Update(invTable.GetChanges(DataRowState.Deleted); //只更新被删除的部分

九、事务

tx=conn.BeginTransaction(IsolationLevel.Serializable);

invDA.SelectCommand.Transaction=tx;

事务操作

tx.Commit();提交 //tx.Rollback();事务回滚

十、数据绑定

简单版本:(对文本框、标签等)

{Controls}.DataBindings.Add("{Property}",{dataSource},"{dataMember}");

其中Property为待绑定的属性,dataSource为DataView或DataTable,dataMember为dataSource其中的某个属性

复杂版本:(对ListBox、ComboBox等)

要分别设置各个属性实现绑定:

DataSource=支持IList的一个对象(DataTable或DataView)

DisplayMember:待显示的DataSource中的一个属性

ValueMember:确定在DataSource中引用哪一个数据行,即实现与DisplayMember的名值对应

DataGrid绑定:

1、可以设置DataSource属性实现静态绑定

2、可以使用SetDataBinding函数实现动态绑定

同时DataGrid支持主控/详细表显示

masterGrid.setDataBinding(customerTable,"");

detailGrid.setDataBinding(customerTable,"Customer_Invoices") //第二个属性要设置成关系约束

这样在主表中选择一行,在子表中就根据主表行中外码在子表中找到相应行

绑定之后,绑定项中就有一个CurrencyManager属性实现游标功能

BindingContext[CustomerTable]返回一个CurrencyManager对象,其中的Position属性可以更改,实现游标的移动。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有