線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1384
推到 Plurk!
推到 Facebook!

單向dataset!

答題得分者是:cashxin2002
chrislao
初階會員


發表:86
回覆:69
積分:36
註冊:2002-12-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-11 15:00:18 IP:202.175.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject); var workid:array of string; x,i:integer; begin SetLength(workid, 3); i:=0; while not simpledataset1.Eof do begin edit1.Text:=edit1.Text simpledataset1.FieldValues['workid']; workid[i]:=simpledataset1.FieldValues['workid']; simpledataset1.Next; i:=i 1; end; sqlquery1.sql.add( 'select date, user'); for x:=0 to high(workid) do sqlquery1.sql.add(', ' workid[x] ' as "' workid[x] '"'); sqlquery1.sql.add('from work where user="chris"'); edit2.Text:=sqlquery1.SQL.Text; sqlquery1.open; end; 用dbexpress連mysql,click button 後出現"operation not allowed on a unidirectional dataset" dbexpress是單向的dataset,有甚麼辦法?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-11 18:45:11 IP:63.84.xxx.xxx 未訂閱
您好!    TSQLDataSet, TSQLQuery, TSQLStoredProc, TSQlTable元件從資料庫中擷取出的資料集后, 將之存放到記憶體(稱之為Cursor), 是屬于單向的資料集形態. 單向的Cursor有很好的存取效率, 對于網頁, 報表顯示等資料展示情況可直接以此來應付, 但對于使用者來回瀏覽, 編輯的作業要求, 這種存取方法就會出現您所說的問題.    解決的方法一: 可以整合TDataSetProvider和TClientDataset元件的特性, 將單向資料集轉換成本機端的雙向資料集, 再指定資料感知元件顯示出來, 這樣即可瀏覽編輯資料, 也可利用快取更新機制來異動資料. 以TSQLDataSet舉例, 其設定方法如下: 1. SQLConnection1元件和SQLDataSet元件正常設定, 并連接資料庫, 處于Open狀態, 您應該已經完成了吧. 2. 在Form中各加一個ClientDataSet元件, DataSource元件, DataSetProvider元件. 3. 屬性設定: ClientDataSet1的ProviderName屬性值設定為DataSetProvider1 DataSource1的DataSet屬性值設定為ClientDataSet1 DataProvider1的DataSet屬性值設定為SQLDataSet1 正确連接后, 將ClientDataSet元件之Active屬性設定True    經過以上的步驟, 此時已經利用ClientDataSet元件來對資料庫進行動作, 所以在更新資料庫的異動時, 需要注意使用: ClientDataSet1.ApplyUpdates(-1); 其它的方法請參考ClientDataSet相關的資料. 解決的方法二: 如果只是要維持應用程式和資料庫兩層架搆, 第一種解決的方法就顯得复雜了一些, 其實Borland還提供了一個叫作SQLClientDataSet的元件, 這個就是整合了ClientDataSet元件, SQLDataSet元件和DataSetProvider元件, 可以簡化設定的建置程式, 設定方法如下: 1. SQLClientDataSet元件屬性設定: ConnectionName屬性值請設定為資料庫名稱 CommandType屬性值請指定擷取資料集的方法, ctTable;ctQuery...有點像ADODataSet的設定. CommandText屬性值會根据CommandType屬性值的設定出現選擇, 如果CommandType屬性值設定為ctTable, 其內容則會出現所有的資料表名稱用以選擇, 如果CommandType屬性值設定為ctQuery的話, 就需要輸入SQL指令了. Active屬性值請設為True. 2. DataSource的DataSet屬性值設定為剛才設定屬性的SQLClientDataSet. 3. 加入資料感知元件, 連接上DataSource 經過以上的步驟, 此時已經利用SQLClientDataSet元件來對資料庫進行動作, 所以在更新資料庫的異動時, 需要注意使用: ClientDataSet1.ApplyUpdates(-1); 參考看看! ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/09/11 18:59:59
------
忻晟
chrislao
初階會員


發表:86
回覆:69
積分:36
註冊:2002-12-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-11 22:51:13 IP:202.175.xxx.xxx 未訂閱
謝謝cashxin2002, 經指教後已把問題解決........
系統時間:2024-05-19 23:01:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!