首页 > 编程 > .NET > 正文

ADO.NET读书笔记系列之------DataSet对象

2024-07-21 02:06:30
字体:
来源:转载
供稿:网友

一、特点介绍

1、处理脱机数据,在多层应用程序中很有用。

2、可以在任何时候查看dataset中任意行的内容,允许修改查询结果的方法。

3、处理分级数据

4、缓存更改

5、xml的完整性:dataset对象和xml文档几乎是可互换的。

二、使用介绍

1、创建dataset对象:dataset ds = new dataset("datasetname");

2、查看调用sqldataadapter.fill创建的结构

    da.fill(ds,"orders");

    datatable tbl = ds.table[0];

    foreach(datacolumn col in tbl.columns)

        console.writeline(col.columnname);

3、查看sqldataadapter返回的数据

①、datarow对象

    datatable tbl = ds.table[0];

    datarow row = tbl.row[0];

    console.writeline(ros["orderid"]);

②、检查存储在datarow中的数据

    datatable tbl = row.table;

    foreach(datacolumn col in tbl.columns)

        console.writeline(row[col]);

③、检查dattable中的datarow对象

            foreach(datarow row in tbl.rows)

                displayrow(row);

4、校验dataset中的数据

①、校验datacolumn的属性:readonly,allowdbnull,maxlength,unique

②、datatable对象的constrains集合:uiqueconstraints,primarykey,foreignkeyconstraints

通常不必刻意去创建foreignkeyconstraints,因为当在dataset的两个datatable对象之间创建关系时会创建一个。

③、用sqldataadapter.fill模式来检索模式信息

5、编写代码创建datatable对象

①、创建datatable对象:datatable tbl = new datatable("tablename");

②、将datatable添加到dataset对象的table集合

    dataset ds = new dataset();

    datatable tbl = new datatable("customers");

    ds.tables.add(tbl);

 

    dataset ds = new dataset();

    datatable tbl = ds.tables.add("customers");

 datatable对象只能存在于至多一个dataset对象中。如果希望将datatable添加到多个dataset中,就必须使用copy方法或clone方法。copy方法创建一个与原datatable结构相同并且包含相同行的新datatable;clone方法创建一个与原datatable结构相同,但没有包含任何行的新datatable。

③、为datatable添加列

    datatable tbl = ds.tables.add("orders");

    datacolumn col =tbl.columns.add("orderid",typeof(int));

    col.allowdbnull = false;

    col.maxlength = 5;

    col.unique = true;

    tbl.primarykey = new datacolumn[]{tbl.columns["customersid"]};

    当设置主键时,allowdbnull自动设置为false;

④、处理自动增量列

    dataset ds = new dataset();

    datatable tbl = ds.tables.add("orders");

    datacolumn col = tbl.columns.add("orderid",typeof(int));

    col.autoincrement = true;

    col.autoincrementseed = -1;

    col.autoincrementstep = -1;

    col.readonly = true;

⑤、添加基于表达式的列

    tbl.columns.add("itemtotal",typeof(decimal),"quantity*unitprice");

6、修改datatable内容

①、添加新datarow

    datarow row = ds.tables["customers"].newrow();

    row["customerid"] = "alfki";

    ds.tables["customers"].rows.add(row);

 

    object[] avalues ={"alfki","alfreds","anders","030-22222"};

    da.tables["customers"].loaddatarow(avalues,false);

②、修改当前行

    修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用sqldataadapter对象来提交交给数据库的待定的更改。

    datarow rowcustomer;

    rowcustomer = ds.tables["custoemrs"].rows.find("anton");

    if(rowcustomer == null)

        //没有查找客户

    else

    {

        rowcustomer["companyname"] ="newcompanyname";       

        rowcustomer["contactname"] ="newcontactname";

    }

 

    //推荐使用这种方式

    datarow rowcustomer;

    rowcustomer = ds.tables["custoemrs"].rows.find("anton");

    if(rowcustomer == null)

        //没有查找客户

    else

    {

        rowcustomer.beginedit();

        rowcustomer["companyname"] ="newcompanyname";       

        rowcustomer["contactname"] ="newcontactname";

        rowcustomer.endedit();

    }

 

    //null表示不修改该列的数据

    obejct[] acustomer ={null,"newcompanyname","newcontactname",null}

    datarow rowcustomer;

    rowcustomer = ds.tables["customers"].rows.find("alfki");

    rowcustomer.itemarray = acustomer;

③、处理datarow的空值

    //查看是否为空

    datarow rowcustomer;

    rowcustomer = ds.tables["customers"].rows.find("alfki");

    if(rowcustomer.isnull("phone"))

        console.writeline("it's null");

    else

        console.writeline("it's not null");

 

    //赋予空值

    rowcustomer["phone"] = dbnull.value;

④、删除datarow

    datarow rowcustomer;

    rowcustomer = ds.tables["customers"].rows.find("alfki");

    rowcustomer.delete();

⑤、清除datarow

    datarow rowcustomer = ds.tables["customers"].rows.find("alfki");

    rowcustomer.itemarray = acustomer;

    da.tables["customers"].remove(rowcustomer);

    或者

    ds.tables["customers"].removeat(intindex);

⑥、使用datarow.rowstate属性 :unchanged,detached,added,modified,deleted

private void demonstraterowstate()

{
// run a function to create a datatable with one column.
datatable mytable = maketable();
datarow myrow;

// create a new datarow.
myrow = mytable.newrow();
// detached row.
console.writeline("new row " + myrow.rowstate);

mytable.rows.add(myrow);
// new row.
console.writeline("addrow " + myrow.rowstate);

mytable.acceptchanges();
// unchanged row.
console.writeline("acceptchanges " + myrow.rowstate);

myrow["firstname"] = "scott";
// modified row.
console.writeline("modified " + myrow.rowstate);

myrow.delete();
// deleted row.
console.writeline("deleted " + myrow.rowstate);
}

⑦、检查datarow中的挂起更改

    datarow rowcustomer;

    rowcustomer = ds.tables["customers"].rows.find("alfki");

    rowcustomer["companyname"] = "newcompanyname";

    string strnewcompanyname,stroldcompanyname;

    console.writeline(rowcustomer["companyname",datarowversion.current]);   

    console.writeline(rowcustomer["companyname",datarowversion.original]);

三、属性方法事件介绍

1、dataset

①、属性

    casesensitive:用于控制datatable中的字符串比较是否区分大小写。

    datasetname:当前dataset的名称。如果不指定,则该属性值设置为"newdataset"。如果将dataset内容写入xml文件,datasetname是xml文件的根节点名称。

    designmode:如果在设计时使用组件中的dataset,designmode返回true,否则返回false。

    haserrors:表示dataset中的datarow对象是否包含错误。如果将一批更改提交给数据库并将dataadapter对象的continueupdateonerror属性设置为true,则在提交更改后必须检查dataset的haserrors属性,以确定是否有更新失败。

    namespace和prefix:指定xml命名空间和前缀

    relations:返回一个datarelationcollection对象。

    tables:检查现有的datatable对象。通过索引访问datatable有更好的性能。

②、方法

    acceptchanges和rejectchanges:接受或放弃dataset中所有挂起更改。调用acceptchanges时,rowstate属性值为added或modified的所有行的rowstate属性都将被设置为unchanged.任何标记为deleted的datarow对象将从dataset中删除。调用rejectchanges时,任何标记为added的datarow对象将会被从dataset中删除,其他修改过的datrow对象将返回前一状态。

    clear:清除dataset中所有datarow对象。该方法比释放一个dataset然后再创建一个相同结构的新dataset要快。

    clone和copy:使用copy方法会创建与原dataset具有相同结构和相同行的新dataset。使用clone方法会创建具有相同结构的新dataset,但不包含任何行。

    getchanges:返回与原dataset对象具有相同结构的新dataset,并且还包含原dataset中所有挂起更改的行。

    getxml和getxmlschema:使用getxml方法得到由dataset的内容与她的架构信息转换为xml格式后的字符串。如果只希望返回架构信息,可以使用getxmlschema。

    haschange:表示dataset中是否包含挂起更改的datarow对象。

    merge:从另一个dataset、datatable或现有dataset中的一组datarow对象载入数据。

    readxml和writexml:使用readxml方法从文件、textreader、数据流或者xmlreader中将xml数据载入dataset中。

    reset:将dataset返回为未初始化状态。如果想放弃现有dataset并且开始处理新的dataset,使用reset方法比创建一个dataset的新实例好。

③、事件

    mergefailed:在dataset的merge方法发生一个异常时触发。

2、datatable

①、属性

②、方法

③、事件

    columnchanged:在列的内容被改变之后触发

    columnchangding:在列的内容被改变之前触发

    rowchanged,rowchanging,rowdeleted,rowdeleting。

3、datacolumn

①、属性

4、datarow

①、属性

    haserror:确定行是否包含错误。

    item:通过指定行的列数,列的名称或datacolumn对象本身,访问列的内容。

    itemarray:获取或设置行中所有列的值。

    rowerror:返回一个包含行错误信息的字符串。

    rowstate:返回datarowstate枚举中的值来表示行的当前状态。

    table:返回datarow对象所在的datatable。

②、方法

    acceptchanges和rejectchanges:提交和放弃挂起更改。

    beginedit、canceledit、endedit

    clearerrors:清除datarow中所有的错误。

    delete:delete方法实际上并不从datarow表的row集合中删除该datarow。当调用datarow对象的delete方法时,ado.net将该行标记为删除,之后调用sqldataadapter对象的update方法来删除其在数据库中对应的行。

    如果希望彻底删除datarow,可以调用delete方法,接着再调用它的acceptechanges方法,还可以使用datarowcollection对象的remove方法完成相同的任务。

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表