Local 端 clientdataset 資料異動回資料庫的處理方式 |
答題得分者是:wuabc
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
各位前輩,請教一個問題。
有兩台異地的 MS-SQL Server。 為了某種原因,需要把 A 地的資料依條件撈出來後再至 B 地更新回資料庫。找不到時 append ,找到時 update。也就是說,A 地的資料永遠比 B 地的新。 每個表格取得的資料筆數不同,有些會近10-20萬筆,為了速度考量,我使用 clientdataset 存成檔案再壓縮後,不論是郵寄、攜帶處理都十分方便。但問題是要更新 B 地資料庫時.. 如何才能最有效率的處理呢? 因為對 clientdataset 的使用經驗不多,所以,還要請前輩們不吝教導,謝謝。 環境為 D5
------
我也在努力學習中,若有錯謬請見諒。 編輯記錄
adonis 重新編輯於 2007-10-17 14:51:56, 註解 無‧
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
我的想法,沒測試過
你把cds的local file帶到另一台電腦上,之後用localcds.loadfromfile再讀回來 我記得這樣cds是無法作applyupdate的 所以你是不是可以再create一組dbconn-->sqlquery-->provider-->newcds(條件 where 1=2) 再用"迴圈"把localcds資料append到newcds 之後newcds.applyupdate 另一種是迴圈"把localcds資料append到database
------
星期一,二...無窮迴圈@@ |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
===================引 用 adonis 文 章=================== 謝謝您的回應,你說的方式我知道,只是.... 嗯....就是不想用 "迴圈" 的方式,覺得不是很有效率,尤其是資料筆數很多時... 不知是否還有其它方式....?? 应该是循环啦,不过我以前写类似程式时用了一个时间戳,这样可以让更新比较小一点,不过仍然有冲突解决的问题,看你如何设定系统规则了。
------
==================== 我为一切作努力! Justin Shen |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
P.D. , 謝謝您熱心的回應,我也會朝這方面查找,若還有"憶"起什麼片斷或資料,還請多指教,謝謝。
===================引 用 P.D. 文 章=================== 我記得MS_SQL本身就有提供差異性資料比對更新功能,無須動用到Delphi的程式碼,應該是使用store procedure 方式直接嵌入到MS_SQL系統中,LOCAL端也可以透過這樣的方式做,很早以前我有實作過,但已經有好多年都是使用IB系統,所以這段已經忘光光,手上也沒有資料,建議你查查MS的手冊!
------
我也在努力學習中,若有錯謬請見諒。 |
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
雖是土法煉鋼,但效果還不錯,
直接給你個Sample自行針酌, p.s.1: Sample中並未考慮Error Exception和Transcation p.s.2: PD的方法我也很想知道 [code sql] CREATE PROCEDURE BulkInsertSample @FileName varchar(100) as --- --- 建立一個Work File --- --- Work File 的欄位數及欄位型態必須對應@FileName的內容 --- CREATE TABLE #__work ( WK_Key int null, WK_F1 int null, WK_F2 int null ) --- --- 執行BULK INSERT將資料倒到#__work --- --- @FileName的欄位與欄位間以,(逗點)隔開,Record以Line Feed結束 --- 這應依你自己的需要(參考BULK INSERT的說明) --- DECLARE @SqlText varchar(1000) SELECT @SqlText = 'BULK INSERT #__work FROM ''' @FileName ''' WITH ( FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'' )' exec (@SqlText) --- --- 如果TableB已存在: UPDATE --- UPDATE TABLE_B SET F_1 = WK_F1, F_2 = WK_F2 FROM TABLE_B, #__work WHERE F_KEY = WK_KEY --- --- 如果TableB不存在: INSERT --- INSERT INTO TABLE_B ( F_KEY, F_1, F_2 ) SELECT WK_KEY, WK_F1, WK_F2 FROM #__work WHERE NOT EXISTS(SELECT * FROM TABLE_B WHERE F_KEY = WK_KEY) --- --- 最後移除Work File --- DROP TABLE #__work [/code]
編輯記錄
wuabc 重新編輯於 2007-10-22 20:06:16, 註解 無‧
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
wuabc, 謝謝您熱心的回應,讓我學習不少。
對你所提的方式,更新與新增是沒問題的,存成文字檔才是我一開始的障礙,因為不曾做過,上網找了相關資訊後才得知。 是阿,我也很想知道 PD 的方法。 ===================引 用 wuabc 文 章=================== 雖是土法煉鋼,但效果還不錯, 直接給你個Sample自行針酌, p.s.1: Sample中並未考慮Error Exception和Transcation p.s.2: PD的方法我也很想知道
------
我也在努力學習中,若有錯謬請見諒。 |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
Mickey, 謝謝您熱心的回應。
沒錯,使用 cds 並搭配 Batchmove 是我一開始的選擇。但就卡在其 source 必須是 TBDEDataset... 後來發現(若沒錯的話)在 D6 有個元件是叫 TBDEClientDataSet ,應該可以解決這個問題,當然這是我的猜測,沒實際使用過,因為我的環境是 D5。 但不知你所謂的 "轉" 是何意?因我曾這麼嘗試過.. 01. source:=TBDEDataSet(CDS); 或是 02. bdeTable:=TBDEDataSet.Create(nil); //bdeTable.DataSource.DataSet.Assign(cdsData); bdeTable.DataSource.DataSet.Assign(TDataSet(cdsData)); 不論是 01 or 02 都行不通,但不知可否請教你所謂的 "轉" 是如何處理呢? ===================引 用 Mickey 文 章=================== 你好: BDE 的 TBatchmove 元件可以參考看看. 但其 Source 必須是 TBDEDataset, 所以 CDS 需要 "轉".
------
我也在努力學習中,若有錯謬請見諒。 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
記得 D6 的 BDEClientDataSet ... 好像只是把 TQuery + TDatasetProvider + TClientDataSet 綁在一起
不是從 BDEDataset 繼承下來...所以...恐怕不行當 TBatchMove 的 Source "轉"喔...呵呵...DBASE/Paradox...都可以阿...只是我不知道有沒有好工具... 可以考慮先將 CDS 轉 Text File...KTop 有一些分享的...找一下. 然後 用 BDE Text Driver (參考 BDE32.hlp) TTable 當 Source |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |