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

Local 端 clientdataset 資料異動回資料庫的處理方式

答題得分者是:wuabc
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-16 16:30:22 IP:210.201.xxx.xxx 訂閱
各位前輩,請教一個問題。
有兩台異地的 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-18 12:14:43 IP:61.225.xxx.xxx 未訂閱
我的想法,沒測試過

你把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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-19 08:24:58 IP:61.62.xxx.xxx 訂閱
謝謝您的回應,你說的方式我知道,只是....

嗯....就是不想用 "迴圈" 的方式,覺得不是很有效率,尤其是資料筆數很多時...
不知是否還有其它方式....??
------
我也在努力學習中,若有錯謬請見諒。
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-19 13:17:21 IP:222.188.xxx.xxx 訂閱

===================引 用 adonis 文 章===================
謝謝您的回應,你說的方式我知道,只是....

嗯....就是不想用 "迴圈" 的方式,覺得不是很有效率,尤其是資料筆數很多時...
不知是否還有其它方式....??


应该是循环啦,不过我以前写类似程式时用了一个时间戳,这样可以让更新比较小一点,不过仍然有冲突解决的问题,看你如何设定系统规则了。
------
====================
我为一切作努力!
Justin Shen

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-20 21:41:47 IP:61.67.xxx.xxx 未訂閱
我記得MS_SQL本身就有提供差異性資料比對更新功能,無須動用到Delphi的程式碼,應該是使用store procedure 方式直接嵌入到MS_SQL系統中,LOCAL端也可以透過這樣的方式做,很早以前我有實作過,但已經有好多年都是使用IB系統,所以這段已經忘光光,手上也沒有資料,建議你查查MS的手冊!
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-20 23:50:45 IP:203.204.xxx.xxx 訂閱
個人認為Select後存成Text File
在於B地,利用StoredProc以Bulk Insert到TempDB
再利用TempDB來處理,
速度上可以有意想不到的好
(如果筆數很多的話)
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-22 10:41:09 IP:210.201.xxx.xxx 訂閱
wuabc, 謝謝您熱心的回應,可否再具體說明呢?

===================引 用 wuabc 文 章===================
個人認為Select後存成Text File
在於B地,利用StoredProc以Bulk Insert到TempDB
再利用TempDB來處理,
速度上可以有意想不到的好
(如果筆數很多的話)
------
我也在努力學習中,若有錯謬請見諒。
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-22 10:43:00 IP:210.201.xxx.xxx 訂閱
P.D. , 謝謝您熱心的回應,我也會朝這方面查找,若還有"憶"起什麼片斷或資料,還請多指教,謝謝。

===================引 用 P.D. 文 章===================
我記得MS_SQL本身就有提供差異性資料比對更新功能,無須動用到Delphi的程式碼,應該是使用store procedure 方式直接嵌入到MS_SQL系統中,LOCAL端也可以透過這樣的方式做,很早以前我有實作過,但已經有好多年都是使用IB系統,所以這段已經忘光光,手上也沒有資料,建議你查查MS的手冊!
------
我也在努力學習中,若有錯謬請見諒。
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-10-22 20:03:52 IP:203.204.xxx.xxx 訂閱
雖是土法煉鋼,但效果還不錯,
直接給你個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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-10-24 08:38:23 IP:218.163.xxx.xxx 訂閱
你好:

BDE 的 TBatchmove 元件可以參考看看.

但其 Source 必須是 TBDEDataset, 所以 CDS 需要 "轉".
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-10-24 10:51:21 IP:210.201.xxx.xxx 訂閱
wuabc, 謝謝您熱心的回應,讓我學習不少。
對你所提的方式,更新與新增是沒問題的,存成文字檔才是我一開始的障礙,因為不曾做過,上網找了相關資訊後才得知。

是阿,我也很想知道 PD 的方法。
===================引 用 wuabc 文 章===================
雖是土法煉鋼,但效果還不錯,
直接給你個Sample自行針酌,

p.s.1: Sample中並未考慮Error Exception和Transcation
p.s.2: PD的方法我也很想知道
------
我也在努力學習中,若有錯謬請見諒。
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-10-24 11:00:42 IP:210.201.xxx.xxx 訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-10-24 11:29:44 IP:218.163.xxx.xxx 訂閱
記得 D6 的 BDEClientDataSet ... 好像只是把 TQuery + TDatasetProvider + TClientDataSet 綁在一起
不是從 BDEDataset 繼承下來...所以...恐怕不行當 TBatchMove 的 Source
"轉"喔...呵呵...DBASE/Paradox...都可以阿...只是我不知道有沒有好工具...

可以考慮先將 CDS 轉 Text File...KTop 有一些分享的...找一下.

然後 用 BDE Text Driver (參考 BDE32.hlp) TTable 當 Source
系統時間:2024-05-17 10:50:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!