利用DataSet更改數據,將更改保存到數據庫中


RowState 是

DataRow 很重要的一個屬性, 表示 DataRow 當前的狀態. RowState 有 Added, Modified, Unchanged, Deleted, Detached 幾種, 分別表示 DataRow 被添加, 修改, 無變化, 刪除, 從表中脫離. 在調用一些方法或者進行某些操作之后, 這些狀態可以相互轉化.

DataAdapter

可以根據 RowState 來決定如何影響數據庫等存儲位置. 如果 DataRow 的狀態為 Added,DataAdapter 將把 DataRow 添加到數據庫等存儲位置, 對於 Modified, Deleted 則將執行更新和刪除操作. 其實, 最終的操作效果還是決定於 DataAdapter 的 SelectCommand, UpdateCommand 等 DbCommand. 如果, 在 UpdateCommand 中寫入 Delete 語句或者執行有刪除操作的存儲過程, 那么狀態為 Modified 的 DataRow 最終將在數據庫中刪除而不是更新.

DataTable.AcceptChanges的理解

OleDbDataAdapter 怎么更新不了數據庫?
String tbName = ds.Tables[0].TableName;
String tem = ds.Tables[0].Rows[0]["BOMID"].ToString();

 

DataRow dr = ds.Tables[0].NewRow();
dr["BOMID"] = "104";
dr["Quantity"] = 10;
ds.Tables[0].Rows.Add(dr);
ds.AcceptChanges();
oleAdaper.Update(ds,ds.Tables[0].TableName);//這里不就是更新數據庫嗎?
刪掉ds.AcceptChanges();就行了。
這是為什么呢?
oleAdaper.Update :對dataRow 的RowState等於deleted/inserted/updated調用響應的delete等 command進行更新
ds.AcceptChanges():將所有的dataRow的Rowstate更改為unchanged,因此也就沒有任何數據更新
或者更改為
oleAdaper.Update(ds,ds.Tables[0].TableName);//
ds.AcceptChanges();
順序顛倒一下,以便做其他用途
一個DataRow對象剛被創建之后其狀態是Detached,是孤立的一個存在,所以建立了DataRow之后在DataRow中的單元填充了數據后還要通過DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable,DataRow添加到DataTable后, 這個DataRow的狀態就轉變為Added。當修改了這個DataRow后,這個DataRow狀態轉為Modified,當用DataRow.Delete()方法刪除DataRow后,DataRow狀態將轉為Deleted,不過此行還存在在DataTable中的,只是狀態改變了,這時用DataTable.Rows.Count查看行數,跟刪除前是一樣的。只有在調用了DataTable.Remove(DataRow)方法后,此DataRow才被從DataTable移除,狀態也回復到Detached孤立狀態。
 
一旦調用了 DataTable.AcceptChanges()方法后,所有的行將根據不同的狀態做不同的處理,Added、Modified、Unchanged將保留當前值,不會改變,Deleted的行將從DataTable中移除,最后所有的行的狀態都置為Unchanged。當DataTable是從DataAdapter.Fill(DataSet,DataTable)方法填充而形成的,Fill()方法將自動調用AcceptChanges()方法,將DataTable的行狀態都置為Unchanged。並且,如果Fill方法中指定的那個DataTable在要填充的那個DataSet不存在時,會生成一個跟數據源表同樣的結構的DataTable並填充數據
用於從 DataTable 對象中刪除 DataRow 對象的方法有兩種:DataRowCollection 對象的 Remove 方法和 DataRow 對象的 Delete 方法。Remove 方法從 DataRowCollection 中刪除 DataRow,而 Delete 方法只將行標記為刪除,當應用程序調用 AcceptChanges 方法時,才會發生實際的刪除。通過使用 Delete,您可以在實際刪除之前先以編程方式檢查哪些行標記為刪除。如果將行標記為刪除,其 RowState 屬性會設置為 Deleted。
在將 DataSet 或 DataTable 與 DataAdapter 和關系型數據源一起使用時, 用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中將行標記為 Deleted,而不會移除它。而 DataAdapter 在遇到標記為 Deleted 的行時,會執行其 DeleteCommand 方法以在數據源中刪除該行,但要在 DataSet 或 DataTable 中刪除該行就要 用 AcceptChanges 方法永久移除該行如果使用 Remove 刪除該行,則該行將從表中完全移除,但 DataAdapter 不會在數據源中刪除該行。
如何使用DataSet,在數據庫中增加、修改、刪除一個數據
 
首先我們打開一個連接
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
string strComm = "select * from UserList";
SqlConnection conn = new SqlConnection(MyConnString);
SqlDataAdapter MyComm = new SqlDataAdapter(strComm,MyConnection);
這里我們為了講解方便,只在DataSet存入一個表的內容:
DataSet MyDataSet = new DataSet();
MyComm.Fil(MyDataSet,"UserList");
此時我們就獲得了一個擁有UserList表數據的DataSet。在講解DataSet之前,我們還需要了解DataSet的結構下面是DataSet的結構樹
DataSet
RelationsCollection
ExtendedProperties
TablesCollection  
DataTables
Rows
Columns
其它
由於我們研究的是DataTable,其它的我們暫時不管他們。一個DataSet中包含多個DataTable,一個DataTable又包含有多個Row,這就是我們操作DataSet的基礎啦:
 
添加數據
添加一數據,從上面的列表中我們可以看出,其實就是添加一行Row,這里我們也來演示一下如何添加一行數據,我們程序一切以DataSet為頂點,呵呵,如果TablesCollection,RowsCollection下去的話,還有一些煩人的dt.AcceptChanges這些方法的調用,很煩人,還是一次搞定吧。
DataRow dr=MyDataSet.Tables["UserList"].NewRow();
dr["UserName"] = "周訊";
dr["ReMark"] = "100";
dr["Comment"] = "漂亮MM";
MyDataSet.Tables.Rows.Add(dr);

 

第一行,我們建立一個新的數據行,它用來儲存我們新加入的數據。然后我們在這個數據行中加入我們需要的數據。dr["UserName"]表明是對UserName字段進行添加,你可以使用dr[1]來添加信息,但是這需要我們事先知道字段在數據表的位置,而且在不知道數據表結構的情況很難知道我們添加的數據的對應情況,所以還是用字段名為好。
最后我們使用RowsCollection的Add方法,將我們新建這一行加入到數據表中。

 

修改數據
知道如何添加數據后,修改數據也是很簡單的事情了.
MyDataSet.Tables["UserList"].Rows[0]["UserName"]="飛刀大哥";
這樣我們就修改了第一行數據中的UserName字段。
 
刪除數據
刪除數據,主要是使用RowsCollection提供的Delete方法,看下面的程序也是很簡單的事情啦:
MyDataSet.Tables["UserList"],Rows[0].Delete();
MyDataSet.AcceptChange();//很重要,但在Add(),Update(),時,要放在 oleAdaper.Update(),之后
這一行數據就已經被刪除了。

 

恢復數據
有時候我們添加/修改數據會出現錯誤,這時候,就需要恢復原來的數據。下面的程序,顯示如何判斷是否有錯誤發生:
if(MyDataSet.HasErrors)
{
MyDataSet.RejectChanges();
}
首先我們檢查DataSet中是否有錯誤發生,如果有就使用RejectChanges()方法,恢復DataSet中的數據。注意這里恢復是在DataSet中所有表以及表中DataRow中的數據,也就是在此交次操作的數據全部恢復。如果我們只需要恢復部分內容,我們可以使用DataTable或DataRow的RejectChanges(),這里就不詳細講解了,使用方法和DataSet一樣,只是操作的對像不同而已。
探測DataSet是否有改動
我們在將DataSet送交給數據庫去保存去,我們需要看看這個DataSet是否已經被改動了。如果沒有改動,我們也就沒有必要去修改數據庫了。
if(MyDataSet.HasChanges)
{
     //保存
}else{
     //不進行任何操作
}

 

更新數據庫
我們上面的操作,都只是針對DataSet的,沒有操作數據庫,但是我們的目的還是要 將數據保存到數據中去,所以我們這里就需要調用DataSetCommand的Update方法。下面的程序顯示如何將DataSet的數據交給數據庫。
MyComm.Update(MyDataSet);
很簡單的一句,呵呵。這里要注意,如果 一個DataSet中包含有多個表,而我們只更新一個,那我們就必須寫明更新的數據表名:
MyComm.Update(MyDataSet,"UserList");
當Update方法被調用后,DataSetCommand會將數據庫中的數據與DataSet中的數據相比較,對不相同的地方進行更新。
對於DataSet的操作,我們這里只講這么多,其實DataSet的方法和屬性有很多,功能也很全,我想現在這里的所講的功能,對一般的操作已經足夠了。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM