有關BeforeUpdateRecord的問題 |
尚未結案
|
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
以下是我的程式碼
procedure TDM.dspMasterBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
var qyTemp:TSQLQuery;
i:Integer;
Str1,Str2:String;
begin
qyTemp:=TSQLQuery.Create(self);
qyTemp.SQLConnection:=dm.SC;
case UpdateKind of
ukInsert:begin
Str1:='Insert into 會員 ';
Str2:='(';
for i:=0 to DeltaDS.fieldcount-1 do
begin
if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then
Str2:=Str2+DeltaDS.Fields.Fields[i].FieldName+',';
end;
Str2:=Copy(Str2,1,Length(Str2)-1)+')';
Str1:=Str1+Str2+' Values ';
str2:='(';
for i:=0 to deltaDS.FieldCount -1 do
begin
if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then
Str2:=Str2+':'+DeltaDS.Fields.Fields[i].FieldName+',';
end;
Str2:=copy(Str2,1,Length(Str2)-1)+')';
Str1:=Str1+Str2;
showmessage(Str1);
qyTemp.SQL.Text:=Str1;
with qyTemp do
begin
parambyname('UserID').Value:=DeltaDS.fieldbyname('UserID').NewValue;
parambyname('Name').Value:=DeltaDS.fieldbyname('Name').NewValue;
parambyname('Sex').Value:=DeltaDS.fieldbyname('Sex').NewValue;
parambyname('Tel').Value:=DeltaDS.fieldbyname('Tel').NewValue;
parambyname('Cell').Value:=DeltaDS.fieldbyname('Cell').NewValue;
parambyname('Address').Value:=DeltaDS.fieldbyname('Address').NewValue;
execSQL(False);
end;
然後執行會出現以下的警告視窗
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 以下是我的程式碼個人覺得您多寫這一段是錯的, 因為DataSetProvider會幫您Update資料, 由於新增了相同Key值的資料, 以致造成此Table的PK重複. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/procedure TDM.dspMasterBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); var qyTemp:TSQLQuery; i:Integer; Str1,Str2:String; begin qyTemp:=TSQLQuery.Create(self); qyTemp.SQLConnection:=dm.SC; case UpdateKind of ukInsert:begin Str1:='Insert into 會員 '; Str2:='('; for i:=0 to DeltaDS.fieldcount-1 do begin if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then Str2:=Str2+DeltaDS.Fields.Fields[i].FieldName+','; end; Str2:=Copy(Str2,1,Length(Str2)-1)+')'; Str1:=Str1+Str2+' Values '; str2:='('; for i:=0 to deltaDS.FieldCount -1 do begin if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then Str2:=Str2+':'+DeltaDS.Fields.Fields[i].FieldName+','; end; Str2:=copy(Str2,1,Length(Str2)-1)+')'; Str1:=Str1+Str2; showmessage(Str1); qyTemp.SQL.Text:=Str1; with qyTemp do begin parambyname('UserID').Value:=DeltaDS.fieldbyname('UserID').NewValue; parambyname('Name').Value:=DeltaDS.fieldbyname('Name').NewValue; parambyname('Sex').Value:=DeltaDS.fieldbyname('Sex').NewValue; parambyname('Tel').Value:=DeltaDS.fieldbyname('Tel').NewValue; parambyname('Cell').Value:=DeltaDS.fieldbyname('Cell').NewValue; parambyname('Address').Value:=DeltaDS.fieldbyname('Address').NewValue; execSQL(False); end;然後執行會出現以下的警告視窗
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 我是參考書中所說的如果在TDataSetProvider元件中的OnBeforeUpdateRecord事件中撰寫任一程式碼的話那麼Tdatasetprovider元件就會認定我們是要自己去處理更新資料的細節所以它就不會在去自己組合sql敘述來幫我們更新資料 而我有試過了真的如您所說的變成了二筆資料所以造成重覆的KEY值加入那麼我要怎麼做還是我的觀念有問題DataSetProvder會不會幫我們更新資料,不是看事件中是否有寫任何程式碼來決定,是看你有沒有設定事件傳入的參數Applied 是True還是False來決定的。 因此在OnBeforeUpdateRecord事件中除了可以改變更新資料的內容外,若程式中已自行處理好更新的動作的話,要把Applied設為True,表示已處理好更新的動作了,如此DataSetProvider就不會再次的更新資料了。 _______________________________________ 深藍的魚,祝您好運..........連連 |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |