討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
為何DataSet無法更新至資料庫..?
更改我的閱讀文章字型大小
作者 : ulongyy(ulong)
[ 貼文 23 | 人氣 3589 | 評價 60 | 評價/貼文 2.61 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/8/13 下午 01:48:43
我想在dataset中刪除資料,然後更新至資料庫(MSSQL2000),執行程式,在Dataset已找到該筆資料,也在dataset中移除了,用後再執行update語法更新資料庫,也都順利執行,並沒有出現任何錯誤訊息,但是資料庫的資料還是沒有更新..不曉得為什麼,有那位大大高手可以幫我解惑嗎?
程式如下:
DA.Fill(DS,"data");
DataRow[] dr= DS.Tables["data"].Select"''篩選條件'",null,DataViewRowState.Unchanged );
DS.Tables["name"].Rows.Remove(dr[0]);
DA.Update(DS,"data");
作者 : kanny1103(卡住)
[ 貼文 26 | 人氣 734 | 評價 30 | 評價/貼文 1.15 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ulongyy註記此篇回應為最佳解答 2004/9/3 下午 05:02:05
你應該要使用delete而不是用remove
兩者的差別好像是
1.delete:在datarow上標記delete的status,當DA.Update時,會依照status來更新資料
2.Remove:是直接刪除datatable上某一筆row的資料,可以當成delete+acceptchange

不知道有沒有講錯^^"
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ulongyy註記此篇回應為最佳解答 2004/9/3 下午 05:36:10
如果是刪除的話 , DataAdapter 的 DeleteCommand 要設定 .
檢查一下 .
作者 : ulongyy(ulong)
[ 貼文 23 | 人氣 3589 | 評價 60 | 評價/貼文 2.61 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/8 下午 01:03:07
System.Data.SqlClient.SqlCommand scmd;
System.Data.SqlClient.SqlDataAdapter sda=new SqlDataAdapter();
System.Data.DataSet ds=new DataSet();
string sql="select * from IPaddress";
scmd=new SqlCommand(sql,conn1);
sda.SelectCommand=scmd;
sda.Fill(ds,"customer");
DataRow[] dr;
dr=ds.Tables["customer"].Select("name='john');
MessageBox.Show(dr[0].ItemArray.GetValue(0).ToString());
dr[0].Delete();
sda.Update(ds,"customer");
我用DELETE的方法做了一次,執行時出如如下錯誤:
當傳遞擁有已刪除資料列的 DataRow 集合時,更新需要有效的 DeleteCommand。
請問小朱及卡住高手要如何設定sda的DeleteCommand呢??
作者 : ulongyy(ulong)
[ 貼文 23 | 人氣 3589 | 評價 60 | 評價/貼文 2.61 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/8 下午 01:11:02
若sda.update(ds,"customer")要再設定sda.deletecommand.text="delete from customer where name='john'" 的話那不是同樣的事情做兩次幹嘛還要sda.update(ds,"customer"),直接下SQL語法不就好了嗎?還更快更方便??

作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ulongyy註記此篇回應為最佳解答 2004/9/8 下午 01:33:00
在 DataAdapter.Update() 之前下 DataAdapter.DeleteCommand 指定 SQL 指令 .

sample:

public static OleDbDataAdapter CreateCustomerAdapter(OleDbConnection conn)
{
  OleDbDataAdapter da = new OleDbDataAdapter();
  OleDbCommand cmd;
  OleDbParameter parm;

  // Create the SelectCommand.

  cmd = new OleDbCommand("SELECT * FROM Customers " +
     "WHERE Country = @Country AND City = @City", conn);

  cmd.Parameters.Add("@Country", OleDbType.VarChar, 15);
  cmd.Parameters.Add("@City", OleDbType.VarChar, 15);

  da.SelectCommand = cmd;

  // Create the DeleteCommand.

  cmd = new OleDbCommand("DELETE FROM Customers WHERE CustomerID = @CustomerID", conn);

  parm = cmd.Parameters.Add("@CustomerID", OleDbType.Char, 5, "CustomerID");
  parm.SourceVersion = DataRowVersion.Original;

  da.DeleteCommand = cmd;

  return da;
}
作者 : ulongyy(ulong)
[ 貼文 23 | 人氣 3589 | 評價 60 | 評價/貼文 2.61 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/8 下午 07:18:21
感謝小朱高手的回答,大致了解了DateSet與DataAdapter搭配的操作,以下是我測試的心得:
若有不對還請指教,經我測試使用DataAdapter.update(ds)的方法必須dr[i].Delete()與DataAdapter.deletecommand配合,兩者缺一不可,等於是用DataRow.delete()之後再用
deletecommand再下次SQL語法,Update資料庫的動作才會生效,不然DataAdapter是不理你的,我也用dr[i].Delete()與sda.DeleteCommand=new SqlCommand("delete from customer where name='john'",conn1);去做效果一樣,但是我還是覺得怪怪的,例如
我dr[i].Delete()的資料是MARY但是deletecommand下的語法是刪除john,其執行的結果會是john的資料全部刪除,但是MARY的資料完全沒有變動,感覺是delete決定的是deletecommand而不是dr[i].delete(),即然這樣,為何又非要兩個搭配使用呢???
真是一個大問號?*2,程式碼如下:
System.Data.SqlClient.SqlCommand scmd;
System.Data.SqlClient.SqlDataAdapter sda=new SqlDataAdapter();
System.Data.DataSet ds=new DataSet();
string sql="select * from customer";
scmd=new SqlCommand(sql,conn1);
sda.SelectCommand=scmd;
sda.Fill(ds,"customer");
DataRow[] dr;
dr=ds.Tables["customer"].Select("name='MARY'");
for (int i=0;i<dr.Length;i++)
{dr[i].Delete();}
@方法一:(執行結果會刪除john,而非MARY)
sda.DeleteCommand=new SqlCommand("delete from customer where name='john'",conn1);
@方法二:(執行結果會刪除參數欄位值符合條件的資料,而非dr[i].delete()之資料)
scmd=new SqlCommand("delete from IPaddress where country=@name ,conn1);
scmd.Parameters.Add("@name",SqlDbType.NVarChar,15,"country");
sda.DeleteCommand=scmd;
sda.Update(ds,"customer");
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/8 下午 11:19:41

>感謝小朱高手的回答,大致了解了DateSet與DataAdapter搭配的操作,以下是我測試的心得:
>若有不對還請指教,經我測試使用DataAdapter.update(ds)的方法必須dr[i].Delete()與DataAdapter.deletecommand配合,兩者缺一不可,等於是用DataRow.delete()之後再用
>deletecommand再下次SQL語法,Update資料庫的動作才會生效,不然DataAdapter是不理你的,我也用dr[i].Delete()與sda.DeleteCommand=new SqlCommand('delete from customer where name=''john''',conn1);去做效果一樣,但是我還是覺得怪怪的,例如
>我dr[i].Delete()的資料是MARY但是deletecommand下的語法是刪除john,其執行的結果會是john的資料全部刪除,但是MARY的資料完全沒有變動,感覺是delete決定的是deletecommand而不是dr[i].delete(),即然這樣,為何又非要兩個搭配使用呢???
>真是一個大問號?

A: DataRow.Delete() 只是把 RowState 的值改成 Deleted , 而要實際執行了 DataAdapter.Update() 才會生效 , 這是 DataSet 這種離線型資料庫的一個特性 .

>@方法一:(執行結果會刪除john,而非MARY)
>sda.DeleteCommand=new SqlCommand('delete from customer where name=''john''',conn1);

A: 這當然只會刪掉 "john" 啊 , 因為你已經鎖定 "john" 了 .

>@方法二:(執行結果會刪除參數欄位值符合條件的資料,而非dr[i].delete()之資料)
>scmd=new SqlCommand('delete from IPaddress where country=@name ,conn1);
>scmd.Parameters.Add('@name',SqlDbType.NVarChar,15,'country');
>sda.DeleteCommand=scmd;
>sda.Update(ds,'customer');

A: 在 Delete() 下了以後 , 該 DataRow 的 RowState (DataRowState列舉型別) 值會改成 Deleted , 而執行 DataAdapter.Update() 時 , 會掃瞄所有資料列的 RowState 值 , 如果是 Added , 就會執行 InsertCommand , Deleted 就會執行 DeleteCommand , Modified 則會執行 UpdateCommand , 這樣講就清楚了吧 .


可參考 :
http://support.microsoft.com/default.aspx?scid=kb;en-us;313485&Product=adonet
http://support.microsoft.com/default.aspx?scid=kb;en-us;314145&Product=adonet
作者 : ulongyy(ulong)
[ 貼文 23 | 人氣 3589 | 評價 60 | 評價/貼文 2.61 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/9 下午 02:02:12
上文我的意思是這樣的操作邏輯有點怪怪的,或許是使用DATAset帶來的好處所必須負出的代價吧,撇開以上不談,經過這兩天的討論及測試.....
我有一點結論了,DataAdapter 與 dataset更新資料庫可以有兩種方法:
1.使用CommandBuilder 自動產生 SQL 陳述式,不過要是單一資料表,效率較差
2.自(指)定SQLcommand 沒有以上限制,效率較好

作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ulongyy註記此篇回應為很有道理 2004/9/14 下午 12:09:44
我是不建議使用 CommandBuilder 啦 ... 這只適合沒學過 SQL 的人 .
而且會耗損到資料庫的效能 .
最好是自己寫 SQL , 還可以搭配到預儲程序 (Stored Procedure) .
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625