全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1307
推到 Plurk!
推到 Facebook!

不用DBWebNavigator如何更新数据?

尚未結案
Winsock_Star
一般會員


發表:5
回覆:10
積分:3
註冊:2003-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-06 21:44:40 IP:60.25.xxx.xxx 未訂閱
我使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-07 22:25:34 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-08 12:34:54 IP:221.198.xxx.xxx 未訂閱
您好,按照您的意思修改后,仍旧无法将数据真正更新回数据库中。 如果不按DBWebNavigator的ApplyToServer按钮,还是无法完成更新。 实际程序就是Delphi8的Demo里的WebGrid,这个Demo本身就有问题。
abbott_chung
一般會員


發表:5
回覆:5
積分:2
註冊:2004-04-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-09 13:42:00 IP:211.23.xxx.xxx 未訂閱
從文中得知,您已經成功的使用DBWeb Controls來作資料庫的(新增,刪除,修改),可否發表你作的過程或參考資料,因為小弟使用DBWeb Controls來連Oracle卻無法達到新增,刪除,修改的功能,且有Error出現(BdpParameter with the same name already exists)...Thanks !!
Winsock_Star
一般會員


發表:5
回覆:10
積分:3
註冊:2003-10-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-09 14:01:20 IP:60.25.xxx.xxx 未訂閱
您好,错误描述的意思很清楚,是同名参数的问题,应该不难解决。 我的程序也是参照Delphi8的Demo做的,您可以参考一下Demo的WebGrid例子。 但是Demo里的例子都离不开DBWebNavigator,没有一个例程是在不用BWebNavigator的情况下更新数据的。 哪位能帮个忙呢?
abbott_chung
一般會員


發表:5
回覆:5
積分:2
註冊:2004-04-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-11 11:06:02 IP:211.23.xxx.xxx 未訂閱
您好...我照您給我的方式去作(参考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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-11 15:23:44 IP:221.197.xxx.xxx 未訂閱
是呀,用bdpCommand可以更新,不过我觉得太麻烦,为什么通过bdpAdapter的Update方法不能更新呢? 我的数据库是Interbase或Access,在使用过程中,除了常见的乱码问题、还有我提出的问题外,没有别的问题了。我没用过Oracle。 看来您是已经可以连上Oracle,就是无法修改。既然“BdpParameter with the same name already exists”,您是不是应该检查一下SQL语句?
abbott_chung
一般會員


發表:5
回覆:5
積分:2
註冊:2004-04-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-11 23:43:57 IP:211.76.xxx.xxx 未訂閱
我的動作也只是拉幾個Component(BdpConnection,BdpDataAdapter,DBWebDataSource及DataSet),然後直接設定必需設定的屬性而已,沒有下什麼SQL,而拉那幾個Component所產生出來的程式,我大約也看了一下,並沒有錯誤,我自己加的程式也只有BdpDataAdapter1.AutoUpdate;這一行而已,搞不清楚那裡出了錯...
Winsock_Star
一般會員


發表:5
回覆:10
積分:3
註冊:2003-10-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-12 08:32:00 IP:221.196.xxx.xxx 未訂閱
你有没有定义参数? BdpDataAdapter的UpdateCommand的CommandText是什么? 如果是运行时的错误,您把错误页面的粘贴上来看看。
abbott_chung
一般會員


發表:5
回覆:5
積分:2
註冊:2004-04-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-12 09:09:56 IP:211.23.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-12 16:41:43 IP:221.197.xxx.xxx 未訂閱
试试把字段名都用单引号括起来,比如PART_NO改成'PART_NO',我不知道在Oracle是用什么符号,在用Access的时候是用[和] 试试看吧,也许管用。
Lord Rabbit
一般會員


發表:3
回覆:25
積分:10
註冊:2003-10-22

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-04 23:55:18 IP:61.219.xxx.xxx 未訂閱
今天也碰到類似困擾,我有一個網頁,上頭一堆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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-01-05 05:53:56 IP:211.22.xxx.xxx 未訂閱
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-01-05 08:53:34 IP:221.197.xxx.xxx 未訂閱
谢谢。 原来也钻研过一会儿DBWeb的代码,后来由于时间问题就没继续。 DBWeb确实还应该改进一下,还是有些麻烦。 不过总算是有办法解决。
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-01-05 09:05:35 IP:211.22.xxx.xxx 未訂閱
Winsock_Star兄 可否指導一下如何解決?
Winsock_Star
一般會員


發表:5
回覆:10
積分:3
註冊:2003-10-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-01-05 10:57:58 IP:221.198.xxx.xxx 未訂閱
bear28你好,我想这个问题应该请Lord Rabbit大哥讲,是他研究出来的,我也没试过。 另外,如果只是想简单地让一个自定义的Button去执行Apply或其它诸如MoveNext等功能,可以用新的DBWebNavigationExtender,十分简单,一用便知。
Lord Rabbit
一般會員


發表:3
回覆:25
積分:10
註冊:2003-10-22

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-01-05 11:15:36 IP:61.219.xxx.xxx 未訂閱
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會送出的東西進去。 解法雖然簡短,道理卻是繞了一段很大的路。設計上的缺陷害人不淺。
系統時間:2024-07-02 15:01:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!