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方法完成相同的任务。