欢迎光临
我们一直在努力

ADO.NET学习笔记(三)-.NET教程,数据库应用

建站超值云服务器,限时71元/月

(由于书上的代码全是用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属性可以更改,实现游标的移动。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ADO.NET学习笔记(三)-.NET教程,数据库应用
分享到: 更多 (0)