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

ADOQuery 新增刪除問題~

答題得分者是:herbert2
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-23 11:47:10 IP:82.210.xxx.xxx 訂閱
各位先進
我想要寫一個簡單的資料庫程式~但是一直有問題希望各位前輩可指導一下~
我在程式裡面放了一個TADOConnection的元件~連接foxpro 5的dbc檔案~連線方面測試過沒有問題~我於OnFormCreate中將其設為true
然後我new 一個 TADOQuery物件~Connetion設定為ADOConnection 下面是我大概的程式碼
FormCreate
ADOQuery->connection = ADOConnection;
ADOQuery->SQL->Text = "SELECT * FROM dataTable";
ADOQuery->ExecSQL();
ADOQuery->Active = true;

Add Button Event
ADOQuery->Insert();
ADOQuery->FieldByName("id")->Value = "AAA";
ADOQuery->FieldByName("name")->Value = "AAA";
ADOQuery->Post();

Delet Button Event
ADOQuery->Delete();

當我Insert資料時 沒有問題~在資料庫可以看到新增的資料~但是當我新增了數筆後,然後執行刪除的按鍵後卻發生execption xxxxx 多重步驟xxxx.
有哪位前輩可以指導一下 呢? Thanks.


我發現如果新增兩次資料如下
10 AAA
10 AAA
當兩筆插入一樣的值時 delete就會出現這樣的execption,也就是說如果刪除有資料重複的值時,就會出現那樣子的execption,如果資料並非重複時卻可以正常刪除。但我用TTable則不會有這樣的問題,TTable即使有相同資料 刪除時也是可以一筆一筆刪除,請問各位前輩該如何使用ADOQuery如TTable一樣,可以一筆一筆刪除資料呢?Thanks.
編輯記錄
ldd 重新編輯於 2008-12-23 21:05:01, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-24 11:35:09 IP:211.72.xxx.xxx 訂閱
TADOTable 之刪除, 有實體的 RecNo 作依據, 故不會重複, 一次 Delete 一筆.
TADOQuery 之刪除, 要依 Primary Key 作依據, 若重複, 便會一次 Delete 多筆而發生 Exception.
原則上, 一個 Table 中是不該允許有全部欄位之欄值皆相等的兩筆及以上的記錄,
故新增及修改時, 就必須使用 Unique Index 等, 來防止產生重複的記錄.
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-24 13:37:36 IP:82.210.xxx.xxx 訂閱
您好 感謝你的回覆

請問一下我記得我都沒有設定什麼key值 那這樣的話他是依據什麼當做Primary key? 是否將所有的欄位當做primary key呢? 因為我只要有一各欄位 不一樣的話就不會發出execption
如果把所有欄位當做primary key話 對於效能有何影響呢?
假設對效能有影響的話,那我如何自己設定1 或 2個 欄位當做primary key呢?
假設今天我資料已經有重複了,那我該如何避免這個問題呢(因為資料庫的資料已經建好了 因為資料很多 要去檢查可能要花很多時間)?
我如何透過exeception 得知是重複資料所造成的呢??

謝謝 !!!

另外我在發生execption時,資料庫的資料都已經被mark成刪除了,所以程式開啟無法看到已經mark成刪除的資料,我該如何解決呢? 感謝

===================引 用 herbert2 文 章===================
TADOTable 之刪除, 有實體的 RecNo 作依據, 故不會重複, 一次 Delete 一筆.
TADOQuery 之刪除, 要依 Primary Key 作依據, 若重複, 便會一次 Delete 多筆而發生 Exception.
原則上, 一個 Table 中是不該允許有全部欄位之欄值皆相等的兩筆及以上的記錄,
故新增及修改時, 就必須使用 Unique Index 等, 來防止產生重複的記錄.
編輯記錄
ldd 重新編輯於 2008-12-24 13:47:47, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-24 14:13:45 IP:211.72.xxx.xxx 訂閱
小弟不會 FoxPro 5 的語法,
若您仍有 FoxPro 5 的系統, 可用 FoxPro 5 的 UnDelete 功能的指令將其還原為未 Deleted;
或找看 MS 之 ADO 語法規範, 看能否以 TADOQuery 執行 UnDelete 功能的指令.
(若是 Dbase III Plus, 則下 RECALL ALL 可將全部被 Mark 為 Deleted 的 Record 恢復為 UnDeleted)

若是 DBMS 的系統, 要剔除重複資料, 則有以下方法:
(1) 若須全部欄位才 Unique, 比較簡單, 先建一結構完全相同的新 Table, 然後執行
INSERT INTO NewTableName SELECT DISTINCT * FROM OldTableName;
(2) 若有 Unique Key, 因有重複, 故無法建 Unique Index, 比較複雜, 須
(a) 先補一臨時欄位(例如: CheckA NUMBER(1)), 舊檔先將 CheckA 全填 1.
(b) 舊檔用 STORED PROCEDURE 做迴圈, ORDER BY KeyList,
執行上下筆比對, 與前一筆 Key 重複者, 就將 CheckA 改填 0.
(c) 建一結構完全相同的新 Table (含 CheckA 欄)
(d) 然後執行
INSERT INTO NewTableName SELECT * FROM OldTableName
WHERE CheckA = 1;
(e) 最後將 NewTableName 之 CheckA 欄去掉, 做法為:
建一結構完全相同的新 Table (不含 CheckA)
INSERT INTO New2TableName SELECT Field1,Field2,.... Field_n FROM NewTableName;
(若是 Dbase III Plus, 則可先做 Unique Index, 再執行 COPY ALL TO NewTable 便可剔除重複的 Record)

無法透過 exeception 機制處理已經有重複資料的檔案!

編輯記錄
herbert2 重新編輯於 2008-12-24 14:41:32, 註解 無‧
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-25 13:39:21 IP:61.57.xxx.xxx 訂閱
感謝您這幾次的熱心回覆~讓我學到很多~
雖然並不怎麼清楚該怎麼弄資料庫~因為最近才開始弄資料庫的東西~
我想在請問一下 ~ 如果我想新增一個欄位!使用者不需要輸入資料
且該欄位可以自動累加數值 我該怎麼弄呢??
Ex1:
INC ID Name
1 20 AAA
2 20 AAA <-----當使用者加入另外一筆資料時 INC 變成 2

Ex2
INC ID Name
1 20 AAA
2 20 AAA <------當使用者刪除此筆資料時 3 20 AAA 這一筆的資料 3是否可以自動變成 2呢?? 下一筆資料新增時可以自動變成 3??
3 20 AAA

謝謝
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-25 17:06:48 IP:211.72.xxx.xxx 訂閱
您這構想不是很好, 若已有10萬筆資料, 刪去第10筆, 須更新99990筆, 會等瘋掉的!
若單機使用且筆數不多, 尚可處理; 若多人在網路上使用, 問題就更複雜了!

資料庫 (Oracle, MS SQL, Sybase, InterBase 等) 通常有提供 Sequence 可自動給號;
FoxPro, Dbase III Plus, Prodox 等 Flat Table 便無此功能.

===================引 用 ldd 文 章===================
我想在請問一下 ~ 如果我想新增一個欄位!使用者不需要輸入資料
且該欄位可以自動累加數值 我該怎麼弄呢??
Ex1:
INC ID Name
1 20 AAA
2 20 AAA <-----當使用者加入另外一筆資料時 INC 變成 2

Ex2
INC ID Name
1 20 AAA
2 20 AAA <------當使用者刪除此筆資料時 3 20 AAA 這一筆的資料 3是否可以自動變成 2呢?? 下一筆資料新增時可以自動變成 3??
3 20 AAA
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-25 17:23:23 IP:61.57.xxx.xxx 訂閱
您好!因為對於資料庫尚未了解~我想如果資料庫能有這樣的功能不需要application在去maintain序號的問題的話~這樣對於設計程式應該比較輕鬆~我只想看看有什麼辦法可以輕鬆達到這樣的需求~感謝你的回覆 : ) 謝謝~
系統時間:2024-04-26 3:57:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!