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

無法刪除檔案內的資料

尚未結案
cosin
一般會員


發表:16
回覆:10
積分:5
註冊:2004-11-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-19 16:58:16 IP:61.221.xxx.xxx 未訂閱
在一個檔案中有多筆欄位值一模一樣的RECORD , 該如何刪除資料只保留一筆! 下列是我測試的結果 : 無效 . . . Open; First; While (Not dm1.queryconfirm.EOF) Do Begin If (DM1.QueryConfirm.FieldByName('acode').Value = Xcode) And (DM1.QueryConfirm.FieldByName('aabs').Value = Xabs) And (DM1.QueryConfirm.FieldByName('asdate').Value = Xsdate) And (DM1.QueryConfirm.FieldByName('aedate').Value = Xedate) And (DM1.QueryConfirm.FieldByName('aday').Value = Xday) And (DM1.QueryConfirm.FieldByName('ahour').Value = Xhour) And (DM1.QueryConfirm.FieldByName('asspec').Value = Xspec) And (DM1.QueryConfirm.FieldByName('seq').Value = Xseq) Then begin DM1.QueryConfirm.Delete; end else begin Xcode := DM1.QueryConfirm.FieldByName('acode').Value; Xabs := DM1.QueryConfirm.FieldByName('aabs').Value; Xsdate := DM1.QueryConfirm.FieldByName('asdate').Value; Xedate := DM1.QueryConfirm.FieldByName('aedate').Value; Xday := DM1.QueryConfirm.FieldByName('aday').Value; Xhour := DM1.QueryConfirm.FieldByName('ahour').Value; Xspec := DM1.QueryConfirm.FieldByName('asspec').Value; Xseq := DM1.QueryConfirm.FieldByName('seq').Value; end; DM1.Queryconfirm.Next ; End; 如何修改煩請指教 ,或可直接下SQL指令!? 黃建道
------
黃建道
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-19 17:23:30 IP:61.70.xxx.xxx 未訂閱
您好: 如果您的兩個record值都一模一樣的話,當您再刪除時應該會引發例外訊息,因為值完全相同會照成SQL Server不曉得該刪哪筆資料,您必須需再資料欄多加一個唯一值的識別欄位,才可以刪除.
cashxin2002
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-19 17:49:23 IP:202.62.xxx.xxx 未訂閱
您好﹗    試試看這樣﹕
//先Select出整個資料表中的單一資料后﹐新增到一個新的資料表中﹕
begin
  dm1.queryconfirm.Close;
  dm1.queryconfirm.SQL.Clear;
  dm1.queryconfirm.SQL.Add('Select Distinct * Into NewTable ');
  dm1.queryconfirm.SQL.Add('From 舊資料表名稱');
  dm1.queryconfirm.ExecSQL;
//此時﹐NewTable中即是需要的資料內容﹒
//接下來的工作可以將舊資料表中的內容清空﹐然后再將NewTable中的資料
//Insert到舊資料表中即可
  dm1.queryconfirm.Close;
  dm1.queryconfirm.EmptyTable; //清空資料表
//上句中﹐清空資料表的工作也可用SQL語法來做﹐如下紅色句﹕
//dm1.SQL.Clear;
//dm1.SQL.Add('Delete From 舊資料表名稱');
//dm1.ExecSQL;
  dm1.queryconfirm.SQL.Clear;
  dm1.queryconfirm.SQL.Add('Insert Into 舊資料表名稱 Select * ');
  dm1.queryconfirm.SQL.Add('From NewTable');
  dm1.queryconfirm.ExecSQL;
  dm1.queryconfirm.DeleteTable; //刪除資料表
//上句中﹐刪除資料表的工作也可用SQL語法來做﹐如下紅色句﹕
//dm1.SQL.Clear;
//dm1.SQL.Add('Drop Table 舊資料表名稱');
//dm1.ExecSQL;
end;
========================= 我是您的朋友﹐有您真好﹗ ========================= 發表人 - cashxin2002 於 2004/11/19 17:57:32
------
忻晟
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-19 18:02:26 IP:61.70.xxx.xxx 未訂閱
版大您好: 這樣處理的話如果資料多的時候,效能會不會有點...@@??,小弟如果有沒有編號的Table,都是直接多一各叫做AutoInc的欄位,然後型態設成識別,每次加一,讓他自己去加.這樣才不會照成無法刪除的問題.
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-19 18:31:36 IP:202.62.xxx.xxx 未訂閱
感謝supman兄的提醒﹐小弟也有過效率方面的考慮﹐所以小弟在上萬筆的資料庫 (Access2000)中做了如上的測試﹐結果在效率上并未有明顯的下降﹐所以應 可試試看﹒ 也曾考慮過加一個流水編號欄位﹐但后來考慮如果使用Access等無直接賦值功能的資料庫形態﹐因為其沒有直接賦流水編號值的功能﹐所以還是需要透過迴圈將 流水編號填入﹐再做下續的動作﹐當資料量大的時候﹐同樣會有效率上的問題﹒ 個人意見﹐敬請糾正﹒    ========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
系統時間:2024-06-02 4:17:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!