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