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

使用ClientDataSet如何新增資料

答題得分者是:likush
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-20 16:21:18 IP:220.228.xxx.xxx 未訂閱
各位大大好 小弟有一個MS SQLServer的資料庫 TABLE Name 為 TEST 欄位 型別 大小 id nvarchar 50 Name nvarchar 50 Dep nvarchar 50 Title nvarchar 50 使用ClientDataSet建立資料後要如何可以新增至資料庫中 ClientDataSet1.Close; ClientDataSet1.CreateDataSet; Randomize; for I := 1 to 200 do begin with ClientDataSet1 do begin Append; FieldByName('ID').AsString := FormatFloat('0000',I); FieldByName('Name').AsString := 'Name' FormatFloat('0000',I); FieldByName('Dep').AsString := 'Dep' FormatFloat('0000',Random(10) 1); FieldByName('Title').AsString := 'Title' FormatFloat('0000',Random(10) 1); Post; end; end; 另外在THREAD中要如何使用ClientDataSet 讀取資料 ADODataSet1<--DataSetProvider1<--ClientDataSet1 在FROM上執行OK 帶入THREAD中會出現 missing Data Provider or data packet 不知道是否有什麼屬性沒有設定 謝謝各位大大的幫忙
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-28 13:14:14 IP:218.163.xxx.xxx 未訂閱
小弟淺見,有錯請指正。 看您的作法,應是先在CLIENTDATASET作一臨時的TABLE,建議插入資料庫。 FOR I := 0 TO CLIENTDATASET1.RECORDCOUNT -1 DO BEGIN ....利用另一個CLIENTDATASET2 執行插入資料動作 CLIENTDATASET.NEXT; END; 當然這有更多好方法,也期待各先進能提出(我也順便學習) 再來有關您錯誤訊息部份的問題,小弟猜測,您是否於THREAD中產生CLIENTDATASET來執行動作,建議您可先測試在指定CLIENTDATASET1的PROVIDER NAME時確認是否有取得,又或者可直接在THREAD中產生DATAPROVIDER 而CLIENTDATASET則指向它。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
JackTasy
初階會員


發表:22
回覆:97
積分:28
註冊:2002-06-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-29 17:30:15 IP:211.76.xxx.xxx 未訂閱
1.若不是要自己臨時產生一個暫時性的 Table ,TClientDataSet 控制的 method 跟 TQuery 應沒有啥麼差別才是。 TQuery -> TDataSetProvider -> TClientDataSet 後,要新增資料可用 cs.Append;  -> cs.FieldByName('xx').AsString := 'aaa'; -> cs.Post; 確定要存入 DB 就呼叫 cs.ApplyUpdates;    2.要用 Thread 寫資料庫控制,必須利用 TSession 另外開啟一組獨立的 Session 比較好。    以上提供參考 
------
JackTasy
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-30 02:44:08 IP:219.84.xxx.xxx 未訂閱
謝謝likush大大及JackTasy大大的回答 小弟因有事出去幾天所以到現在才回應,先說聲抱歉 小弟剛學了TClientDataSet這個元件,只是一個想法不知對不對 小弟想先自行建立一個臨時TABLE,先將要新增的資料填入,然後再一次做新增的動作,但不是逐筆的新增 就我所知再SQL語法中可以一次新增一個TABLE的資料,所以想試試看可不可以一次全部新增 另一個問題是我再Thread 中要動態產生TDataSetProvider 及 TClientDataSet 物件不知如何使用如果FROM上直接CREAT沒有問題,可是到了Thread就會出現 missing Data Provider or data packet 這個問題 以下是我的做法 if not ADataSet.Active then begin ADataSet.Open; end; try dsp := TDataSetProvider.Create(self); dsp.Name :='DataSetProvider'; dsp.DataSet := ADataSet; try cds := TClientDataSet.Create(self); CDS.SetProvider(dsp); cds.ProviderName := dsp.Name; cds.Active := true; finally cds.Close; FreeAndNil(cds); inherited; end; finally FreeAndNil(dsp); inherited; end;
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-30 11:18:25 IP:211.23.xxx.xxx 未訂閱
就您的問題。 可考慮利用本地端整批更新的方式或新增至臨時的table裡再利用SQL語法直接整批作業,個人小建議,如果您的資料是由另外的table裡取出再經過SQL語法判斷產生。可考慮用STORED PROCEDURE的方式來作。 ---------------------------- cds.ProviderName := 'DataSetProvider'; 試試看,或設中斷點來看看CLIENTDATASET是否有正確取到DataSetProvider ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-30 11:48:08 IP:211.75.xxx.xxx 未訂閱
likush 大大您好 小弟的資料來源是透過idHTTPServer接收的,經過處理之後再存入資料庫中,不知要如何可以整個新增至資料庫中,可否舉個例子說明,另外STORED PROCEDURE要如何做呢 還有在Thread中沒辦法 TDataSetProvider.Create(self); 但是可以 TDataSetProvider.Create(MainFrm.DataSetProvider1); 不知是什麼原因,可是就算可以Create也一樣會出現 missing Data Provider or data packet 這個錯,不知道還有什麼屬性沒設定正確,還請大大指點一下 謝謝
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-30 12:11:44 IP:211.75.xxx.xxx 未訂閱
dannynice 你好 Delphi 在 RunTime 時臨時建立系統組件所需相關參數 , 有時會抓取不到 . 建議你在 DesignTime 就先設好 Provider , 再行 Run 看看 . 也許有用 .別忘 ApplyUpdate . 發表人 - stillalive 於 2004/08/30 12:13:44
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-30 13:56:44 IP:211.75.xxx.xxx 未訂閱
stillalive 大大感謝您的回答 小弟必須在Thread中做資料的更新,所以必須在Run Time中設定屬性,而且必須動態產生數個,不知要如何做 謝謝
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-31 15:11:07 IP:211.23.xxx.xxx 未訂閱
dsp := TDataSetProvider.Create(self); dsp.Name :='DataSetProvider'; dsp.DataSet := ADataSet; try cds := TClientDataSet.Create(self); CDS.SetProvider(dsp); cds.ProviderName := dsp.Name; <--將這段拿掉,試試看 cds.Active := true; finally ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-01 17:00:52 IP:211.75.xxx.xxx 未訂閱
likush 大大您好 小弟測試的結果 ADataSet := TADODataSet.Create(self); dsp := TDataSetProvider.Create(self); dsp.Name :='DataSetProvider'; dsp.DataSet := ADataSet; cds := TClientDataSet.Create(self); CDS.SetProvider(dsp); cds.Active := true; 在Thread中必須設成下列方式 否則Compile時會出現ERROR TestClientDataSet.pas(101): Incompatible types: 'TComponent' and 'TestClientDataSetThread' ADataSet := TADODataSet.Create(nil); dsp := TDataSetProvider.Create(nil); dsp.Name :='DataSetProvider'; dsp.DataSet := ADataSet; cds := TClientDataSet.Create(nil); CDS.SetProvider(dsp); cds.Active := true; 可是在更新資料時會出現下列的錯誤 Record not found or changed by another user 測試的結果是更新的資料中有些欄位資料是空白or NULL or 欄位的型態為日期型態,不知是否有方法可以解決 另外 ADataSet := TADODataSet.Create(nil); ADataSet := TADODataSet.Create(self); 有什麼不同 謝謝
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

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