使用ClientDataSet如何新增資料 |
答題得分者是:likush
|
dannynice
一般會員 發表:12 回覆:19 積分:6 註冊:2003-07-25 發送簡訊給我 |
各位大大好
小弟有一個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 發送簡訊給我 |
小弟淺見,有錯請指正。
看您的作法,應是先在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 發送簡訊給我 |
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
就您的問題。
可考慮利用本地端整批更新的方式或新增至臨時的table裡再利用SQL語法直接整批作業,個人小建議,如果您的資料是由另外的table裡取出再經過SQL語法判斷產生。可考慮用STORED PROCEDURE的方式來作。
----------------------------
cds.ProviderName := 'DataSetProvider';
試試看,或設中斷點來看看CLIENTDATASET是否有正確取到DataSetProvider =========================
讀萬卷書~不如來K.TOP走一遭
=========================
|
dannynice
一般會員 發表:12 回覆:19 積分:6 註冊:2003-07-25 發送簡訊給我 |
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 發送簡訊給我 |
|
dannynice
一般會員 發表:12 回覆:19 積分:6 註冊:2003-07-25 發送簡訊給我 |
|
likush
高階會員 發表:5 回覆:235 積分:103 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |