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

關於table與table 之間的轉移(備份)

尚未結案
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-23 15:52:02 IP:61.219.xxx.xxx 未訂閱
請問各位先進: 我有一個問題,就是將A資料庫的a table 複製到B資料庫的b table(兩個資料庫是一模一樣的),然後將a table轉移過去的資料清空 可否解說一下使用Query元件的流程,或是提供sample 給我參考一下 謝謝^^ ps:不是整個table的轉移,是要下條件的,比如說是以月份為單位去做轉移
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-23 16:57:31 IP:61.219.xxx.xxx 未訂閱
還是我將出現的錯誤訊息貼出來讓各位先進幫忙debug
procedure TForm1.Button2Click(Sender: TObject);
begin
   DBGrid_Tapmc.DataSource.DataSet.First;
   WHILE NOT DBGrid_Tapmc.DataSource.DataSet.Eof DO
        BEGIN
          Backup_Query.Insert;
          Backup_Query.FieldByName('NAME').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('NAME').Value;
          Backup_Query.FieldByName('SIZE').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('SIZE').Value;
          Backup_Query.FieldByName('WEIGHT').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('WEIGHT').Value;
          Backup_Query.FieldByName('AREA').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('AREA').Value;
          Backup_Query.FieldByName('BMP').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('BMP').Value;
          Backup_Query.FieldByName('receive_da').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('receive_da').Value;
          Backup_Query.Post;
          DBGrid_Tapmc.DataSource.DataSet.Next;            END;    end;
結果出現 Backup_Query : Cannot not modify a read-only dataset 不曉得這個訊息是怎麼產生的@@ 發表人 - dino 於 2004/10/23 23:10:38
cashxin2002
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-23 17:08:28 IP:202.62.xxx.xxx 未訂閱
您好﹗    請將Query元件的RequestLive屬性值設為﹕True 利用SQL查詢語句回傳的資料為ReadOnly(唯讀狀態)﹐但其可以透過RequestLive屬性值為True將其改成讀寫狀態﹒    ========================= 大病初愈﹐休養調整中... ========================= 發表人 - cashxin2002 於 2004/10/23 17:10:19
------
忻晟
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-23 18:11:12 IP:61.219.xxx.xxx 未訂閱
版主...嗚...嗚 很感謝你啦,原來這樣就解決了,我搞了一個下午 就在"Cannot perform this operation on a closed dataset" 和 "Cannot modify a read-only dataset" 這兩個錯誤訊息打轉...真是搞死我了@@ 實在是對於"資料集"這個東東感到頭痛,例如insert,post等等method 在什麼狀態底下要如何使用,看了很幾本書還是覺得零零落落的,無法了解 要是搭配上DataControl元件的話,還有dsEdit,dsxxxx等等狀態要了解 還有event又分AfterXXX跟beforeXXX等等,真是頭痛 這邊有沒有什麼教學文件可以讓菜鳥對於資料庫的程式可以做個完整透徹的 了解呢? 再一次感謝您^^ 後輩 敬上 祝身體安康
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-23 19:38:51 IP:61.219.xxx.xxx 未訂閱
還是有一個問題發生 使用Backup_Query.Insert 則會發生資料重複, 如果使用Backup_Query.Edit,則只有最後一筆資料會post過去, 真是奇怪,用step over追蹤發現每一筆都有run 到post啊!! 但是就是只有最後一筆過去而已. 要怎麼樣才可以讓資料不重複呢? 還是有什麼方式可以去判斷,有重複的資料就跳過去或是把它覆蓋掉呢? 發表人 - dino 於 2004/10/23 19:40:00
likush
高階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-25 03:48:13 IP:220.134.xxx.xxx 未訂閱
Procedure TForm2.Button1Click(Sender: TObject); Begin DBGrid_Tapmc.DataSource.DataSet.First; While Not DBGrid_Tapmc.DataSource.DataSet.Eof Do Begin If Not Query1.Locate(比對欄位名稱, query.fieldbyname(欄位).asstring, [loCaseInsensitive]) Then Begin Backup_Query.Insert; Backup_Query.FieldByName('NAME').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('NAME').Value; Backup_Query.FieldByName('SIZE').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('SIZE').Value; Backup_Query.FieldByName('WEIGHT').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('WEIGHT').Value; Backup_Query.FieldByName('AREA').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('AREA').Value; Backup_Query.FieldByName('BMP').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('BMP').Value; Backup_Query.FieldByName('receive_da').Value := DBGrid_Tapmc.DataSource.DataSet.FieldByName('receive_da').Value; Backup_Query.Post; End; DBGrid_Tapmc.DataSource.DataSet.Next; End; End; ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
likush
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-25 03:57:18 IP:220.134.xxx.xxx 未訂閱
忘了補充,你使用。EDIT方式只是將資料作修改而非新增,故依你的作法只會重覆更改同筆資料而已。再來要資料不重覆,則需你在你新增資料預作判斷是否已存在同相關資料,故應用方法有locate及filter等許多方式,你可依你的需求來選擇應用那種方法作判斷,當然你必須有一個不可重覆或作為主要的判斷欄位。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
cashxin2002
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-25 09:15:52 IP:202.62.xxx.xxx 未訂閱
dino﹐您好﹗    建議您找[Delphi實務經典]這本書來看看﹐第三波出版﹐作者林金霖﹒ 此書也是小弟的入門書籍﹐看后會有意想不到的收獲﹐特別是后段的資料庫程式設計的基礎知識講解很詳細﹐值得一看﹒    ========================= 大病初愈﹐休養調整中... =========================
------
忻晟
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-25 09:39:33 IP:61.219.xxx.xxx 未訂閱
likush 您好 謝謝您的答覆 我試過了,不過不是很了解Locate,看過Help也不是很懂 先說明一下我所使用的元件: Source資料庫使用: TDatabase1 TQuery名稱:Master_Query TDBGrid名稱:DBGrid_Tapmc Dest資料庫使用: TDatabase2 TQuery名稱:Backup_Query 兩個資料庫有相同的table ,欄位是NAME,SIZE,WEIGHT,AREA,BMP,receive_da 將Source資料庫的Master_Query open 和 Dest資料庫的Backup_Query open之後就將DBGrid_Tapmc得到的資料集指定給Backup_Query 所以是跨資料庫的table複製,我的資料庫是用dbf格式 假設都有設NAME為Unique 那Query1.Locate(比對欄位名稱, query.fieldbyname(欄位).asstring, [loCaseInsensitive])裡面的值要怎麼填呢? 我試的結果是都沒有複製過去?? 發表人 - dino 於 2004/10/25 09:41:23
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-25 10:37:15 IP:61.219.xxx.xxx 未訂閱
後來我try出來了,寫法如下 If Not Backup_Query.Locate('NAME', Master_Query.FieldByName('NAME').AsString, [loCaseInsensitive]) Then 謝謝各位的解答 我只是先用Paradox做試驗, 我想如果使用SQL Server的話,資料重複的問題應該由後端來處理掉, 檢查是否重複的動作就不用自己寫了, 但是insert時應該會由後端產生例外出來, 不曉得要如何將這個例外隱藏起來? 讓資料重複時就覆蓋掉或跳過,沒有時就新增?
cashxin2002
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-25 11:04:08 IP:202.62.xxx.xxx 未訂閱
您好﹗    既然是使用Query﹐請參考一下如下連接﹕ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56580 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44779        ========================= 大病初愈﹐休養調整中... =========================
------
忻晟
likush
高階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-25 11:52:55 IP:220.134.xxx.xxx 未訂閱
個人建議,如果是以MS SQL的方式來作的話,你可利用像STORED PROCEDURE或TRIGGER方式,在新增時判斷是否重覆?有則忽略該筆不執行。關於上述方式之用法,你可參考相關書籍或搜尋站上相關文章。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-29 14:09:40 IP:61.219.xxx.xxx 未訂閱
很感謝版主跟likush兩位的熱情相助 可惜只能給一位分數 我想版主的等級應該比較高吧 那我就給likush分數好了
系統時間:2024-04-25 21:51:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!