一
問題描述
某事業單位很早以前開發了一套基於Oracle
數據庫的管理系統
工作在WINDOWS 下
采用C/S工作模式
數據庫的字符集為WE
ISO
P
由於工作需要
需開發一套在此基礎上的查詢系統
為保證原系統的安全和完整性
要求查詢系統不得直接使用原數據庫
影響目前系統的運行
只能通過中間件技術實現查詢系統對原數據庫的訪問
同時由於原系統在使用過程中發現數據存取的速度很慢
要求查詢系統使用SQL SERVER
數據庫進行查詢
二
解決方案分析
根據用戶的需求和原系統的工作模式
可采用的方案主要有以下三種
利用SQL SERVER 的作業調度功能
定時執行數據遷移
實現數據同步
DTS(數據轉換服務)是微軟從SQL SERVER
開始引入的
DTS的主要目的是在系統之間遷移數據和數據庫對象
DTS原來是用作SQL SERVER OLAP服務的ETL工具
後來微軟意識到DTS 不僅可以作為OLAP 服務的數據抽取和載入工具
還可以實現異種數據庫間的遷移
因此擴充了DTS的功能
在SQL SERVER
中提供了簡單易用的DTS 設計器
利用DTS設計器可以很方便地解決本文涉及的問題
但是
如果要遷移的對象比較多
利用DTS設計器的工作量就相當大了
因此
提出了第二種解決方案
利用DTS 編程實現數據的定時遷移
該方法原理簡單
但需要對 DTS 有一定的了解
性能也比較好
熟悉VB
VC
DELPHI等任一種編程語言
均可以利用SQL Server 提供的 DTS COM接口實現數據的遷移
DTS 遷移規范保存在一個稱為包的實體中
DTS包是基本的DTS組件的容器
這些組件包括連接
任務
轉換
工作流
不同的組件完成不同的功能
它們共同構成數據遷移的實現主體
要通過DTS編程實現數據庫的遷移
至少需要兩個連接對象
其中
一個提供數據
一個接收數據
至少需要一個轉換對象
完成數據從源到目的服務器的轉換
至少需要兩個任務對象
完成遷移之前的目的服務器上的數據表的刪除和重建
至少需要三個工作流對象
為遷移工作設計執行的步驟
為了實現定時執行
程序還要完成對SQL SERVER AGENT 進行編程實現遷移作業的提交和調度
由於SQL SERVER 的作業調度是通過 SQL SERVER AGENT 來管理的
因此需要在啟動SQL SERVER 時同時啟動SQL SERVER AGENT
采用中間件技術
前面兩種方案都是利用DTS
離不開SQL Server 的DTS
利用中間件技術
可以通過實現一服務程序
定時將數據從ORACLE服務器取出然後轉換成SQL SERVER 數據庫的數據格式
傳入SQL SERVER
其工作原理如下圖
該技術可以通過通過ODBC 或OLE DB技術編程實現數據的定時獲取和轉換傳出
對於編程的工作量較大
原因在於ORACLE 和SQL SERVER的數據類型的不一致必須通過類型轉換實現數據的一致
同時效率也比較低
由於作為一種服務程序長駐內存
對程序的質量要求至少不得出現內存洩露
否則
可能使服務器癱瘓
不過這種方案的好處在於可以脫離SQL SERVER
維護的工作量相對要輕一些
比較上述的三種方案
從實現的難度上比較
第一種最低
最後一種最高
從效率上比較
最後一種最低
第一種與第二種最高
從可維護性來比較
第一種最低
最後一種最高
綜合三種方案
筆者認為第二中方案較好
發布到目標系統上
只需在現場運行一次數據遷移的任務安裝程序
就能實現SQL Server 定時從Oracle服務器遷移數據
同時
所有的工作量也只是選擇要遷移的數據表
該工作
如果要遷移的表是已知的
甚至可以從文件中直接讀入
就能實現任務的安裝
下面介紹采用第二種方案用VB編寫在SQL SERVER上能定時自動進行數據遷移任務的安裝程序的方法
三
數據遷移的實現
為了能在目標機上順利實現數據遷移
將DTS包存儲到SQL SERVER
在SQL SEVRE AGENT 的作業調度中采用DTSRUN 來加載和執行DTS包
這樣
所有的工作只需作一次
就可將整個數據遷移的DTS包和SQL SERVER的作業發布到目標機上
(一)算法設計
程序的流程圖如下
(二)關鍵技術說明
要實現數據的遷移
必須考慮兩個問題
第一
數據的遷移要求目標系統上的數據與ORACLE 數據庫中的數據要一致
因此
目標數據庫中的相應表必須在遷移之前被刪除
所以遷移任務的第一個是對相應表執行刪除的SQL 任務
第二
由於目標表被刪除
遷移的數據失去寄托
因此遷移任務的第二步必須在目標系統上重建相應的表
在建表時
由於ORACLE 數據庫的數據類型與SQL SERVER 不一致
因此必須進行類型轉換
它們之間的對應關系和轉換要求如下表
(三)程序設計
界面設計
如圖所示
編碼
(
) 在整個程序運行過程中
需要兩個全局變量
DTS 包 oPackage 和Oracle 服務器連接 oraCon
當設置好連接參數後
單擊
連接Oracle服務器
將與 ORACLE 服務器連接
並取出所有表
然後填充第一個列表框
並在下面表格中顯示相應的數據(如果選中了
顯示數據
)
Private Sub Command
_Click()
Dim rst As New ADODB
Recordset
With oraCon
Provider =
OraOLEDB
Oracle
Properties(
User ID
) = Text
(
)
Text
Properties(
Password
) = Text
(
)
Text
Properties(
Data Source
) = Text
(
)
Text
Properties(
Persist Security Info
) = True
Open
End With
With rst
Source =
select * from all_tables where tablespace_name<>
SYSTEM
order by owner
table_name
ActiveConnection = oraCon
CursorType = adOpenKeyset
LockType = adLockOptimistic
Open
End With
RefreshGrid rst
FillTabList rst
rst
Close
Command
Enabled = False
End Sub
(
) 在第一個列表框中雙擊數據表列表
將選中的表加入第二個列表
如果
顯示數據
被選中
將顯示相應表的數據
同時顯示表的結構信息
在第二個列表框中雙擊數據表將選中項移出該列表框
Private Sub List
_DblClick()
Dim rst As New ADODB
Recordset
Dim strSQL As String
Dim tmpStr As String
List
AddItem (List
List(List
ListIndex))
If Check
Value =
Then
With rst
Source =
select * from
& List
List(List
ListIndex)
ActiveConnection = oraCon
CursorType = adOpenKeyset
LockType = adLockOptimistic
Open
End With
RefreshGrid rst
rst
Close
End If
tmpStr = List
List(List
ListIndex)
strSQL =
SELECT COLUMN_ID
COLUMN_NAME
DATA_TYPE
DATA_LENGTH
DATA_PRECISION
DATA_SCALE
strSQL = strSQL &
FROM SYS
ALL_TAB_COLUMNS WHERE TABLE_NAME=
strSQL = strSQL &
& Mid(tmpStr
InStr(
tmpStr
vbTextCompare) +
) &
strSQL = strSQL &
and OWNER=
& Mid(tmpStr
InStr(
tmpStr
vbTextCompare)
) &
With rst
Source = strSQL
ActiveConnection = oraCon
CursorType = adOpenKeyset
LockType = adLockOptimistic
Open
End With
rst
MoveFirst
RefreshPropGrid rst
rst
Close
PropGrid
Visible = True
SQLScriptList
Visible = False
End Sub
Private Sub RefreshGrid(rst As ADODB
Recordset)
Dim fld As ADODB
Field
On Error Resum
From:http://tw.wingwit.com/Article/program/SQLServer/201311/21974.html