不用DBWebNavigator如何更新数据? |
尚未結案
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
我使用DBWeb Controls开发asp.net程序,使用DBWebNavigator时,一切很正常。
修改完数据,按ApplyToServer按钮,数据就真正更新回数据库中。 但是我想不用DBWebNavigator(我把DBWebNavigator删除),而是想在DBWebGrid里加一个按钮列(编辑、更新、取消),从而在DBWebGrid的UpdateCommand事件中,把数据就真正更新回数据库。 我这样写代码: procedure TWebForm1.DBWebGrid1_UpdateCommand(source: System.Object; e:
System.Web.UI.WebControls.DataGridCommandEventArgs);
begin
Self.Employees.AcceptChanges;
Self.BdpDataAdapter1.Update(Self.Employees, 'Employee');
end; procedure TWebForm1.DBWebDataSource1_OnApplyChangesRequest(sender:
System.Object; e: Borland.Data.Web.WebControlEventArgs);
begin
BdpDataAdapter1.AutoUpdate;
end; 为什么数据更新不到数据库中呢?我应该怎么做?
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
HI, 請將你的兩行程序調過來,
procedure TWebForm1.DBWebGrid1_UpdateCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); begin Self.BdpDataAdapter1.Update(Self.Employees, 'Employee'); Self.Employees.AcceptChanges; end;由於你原來先調用 AcceptChanges , 會將 buffer 清空, 造成 adapter update 原資料庫時無資料可以寫回, 也就發生了問題!! |
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
abbott_chung
一般會員 發表:5 回覆:5 積分:2 註冊:2004-04-06 發送簡訊給我 |
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
abbott_chung
一般會員 發表:5 回覆:5 積分:2 註冊:2004-04-06 發送簡訊給我 |
您好...我照您給我的方式去作(参考Demo的WebGrid例子),連InterBase地確是可以用,但修改成連oracle,結果又出現"BdpParameter with the same name already exists"的錯誤訊息...不知您是連InterBase還是其他的DB呢 ?? 若不要透過DBWebNavigator來更新DB,您可以參考以下方式:
s1:= 'update ABC '
' set a = ? ,b = ? '
' where c = ?'; bdpAD.SelectCommand.CommandText := s1;
bdpAD.SelectCommand.CommandType := CommandType.Text;
//
bdpAD.SelectCommand.Parameters.Clear;
//
bdpAD.SelectCommand.Parameters.Add('a',DBType.String,0);
bdpAD.SelectCommand.Parameters['a'].Value := 'PP';
bdpAD.SelectCommand.Parameters.Add('b',DBType.String,0);
bdpAD.SelectCommand.Parameters['b'].Value := 'KK';
bdpAD.SelectCommand.Parameters.Add('c',DBType.String,0);
bdpAD.SelectCommand.Parameters['c'].Value := '9';
//
bdpAD.SelectCommand.ExecuteNonQuery;
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
abbott_chung
一般會員 發表:5 回覆:5 積分:2 註冊:2004-04-06 發送簡訊給我 |
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
abbott_chung
一般會員 發表:5 回覆:5 積分:2 註冊:2004-04-06 發送簡訊給我 |
UpdateCommand的CommandText如下:
UPDATE A102_MATERIAL SET PART_NO = ?, DESCRIPTION = ?, SPEC = ?, QTY = ?, UNIT = ?, LOC = ?, MODIFY_QTY = ? WHERE PART_NO = ? AND DESCRIPTION = ? AND SPEC = ? AND QTY = ? AND UNIT = ? AND LOC = ? AND MODIFY_QTY = ? 錯誤訊息如下:
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
Lord Rabbit
一般會員 發表:3 回覆:25 積分:10 註冊:2003-10-22 發送簡訊給我 |
今天也碰到類似困擾,我有一個網頁,上頭一堆DB Web control跟一個DataSet,我不過就是想要一個能新增一筆資料的簡單網頁而已,可是沒放DBWebNavigator就硬是不讓我過;不去按DBWebNavigator的apply to server button也不讓我過。 為了這種DB Web control設計上的缺陷,整整耗費了一個白天又半個晚上,翻了好幾個小時的DB Web control C# source code,終於實驗出了解決之道:
(只差些就想要放棄DB Web control,完全走手工設定data binding的路)
procedure ApplyUpdates(p:Page;Params:NameValueCollection;tableName:String;psm : IDBPostStateManager;ctrl:WebControl); var postCollection : NameValueCollection; begin postCollection := NameValueCollection.Create(Params); postCollection.Add(tableName ':ApplyToServer','Apply To Server'); psm.SetChangedValues(p, postCollection, tableName, ctrl); end; procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs); begin ApplyUpdates(Self, Request.Params, 'form', DBWebDataSource1, Button1); end;發表人 - Lord Rabbit 於 2005/01/05 00:01:22 發表人 - Lord Rabbit 於 2005/01/05 00:02:12 |
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
procedure ApplyUpdates(p:Page;Params:NameValueCollection;tableName:String;psm : IDBPostStateManager;ctrl:WebControl);
var
postCollection : NameValueCollection;
begin
postCollection := NameValueCollection.Create(Params);
postCollection.Add(tableName ':ApplyToServer','Apply To Server');
psm.SetChangedValues(p, postCollection, tableName, ctrl);
end;
procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
ApplyUpdates(Self, Request.Params, 'form', DBWebDataSource1, Button1);
end; 請問有多個參數,Request.Params要如何下?
'form'是table的名稱嗎?
psm.SetChangedValues(p, postCollection, tableName, ctrl);
psm : IDBPostStateManager無SetChangedValues的methond? 發表人 - bear28 於 2005/01/05 09:26:27
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
|
Winsock_Star
一般會員 發表:5 回覆:10 積分:3 註冊:2003-10-12 發送簡訊給我 |
|
Lord Rabbit
一般會員 發表:3 回覆:25 積分:10 註冊:2003-10-22 發送簡訊給我 |
Bear28: 這個解法是Delphi 8上頭的,Request.Params就裝了所有HTTP傳來的參數。IDBPostStateManager是DBWebDataSource所實作的interface之一,但是它的方法不會在你用code insight看DBWebDataSource時出現。 原理是ASP.NET在post back時,各個有權進行submit的control會去檢查是不是自己submit的。DBWebNavigator裡頭那幾個button也會做自己的檢查,但是它們的control id是類似tableName ':ApplyToServer'的值,由於有那個冒號在,我們不能直接放個同id的button control去冒充頂替,只好自己去做apply to server button按下時做的事情→把Request.Params的內容拿來塞給IDBPostStateManager.SetChangedValues()。 IDBPostStateManager.SetChangedValues()裡頭會檢查是哪個DBWebNavigator的button送出submit的,我們要騙過這個檢查,讓它以為是apply to server button被按下,所以我才另外生一個NameValueCollection,把Request.Params的內容先塞進去,再放一個冒牌的apply to server button會送出的東西進去。 解法雖然簡短,道理卻是繞了一段很大的路。設計上的缺陷害人不淺。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |