INF:DTS 封裝開發、部署及效能

文章翻譯 文章翻譯
文章編號: 242391 - 檢視此文章適用的產品。
本文曾發行於 CHT242391
全部展開 | 全部摺疊

在此頁中

結論

本文的用途是提供詳細資訊,以協助「資料轉換服務」(DTS) 封裝的開發及部署。 此外還包括了一些增進封裝效能的提示。

其他相關資訊

使資料連接更具彈性



DTS 封裝完全自成一個單位。所有連接資料都是在設計階段讀入連接屬性集合, 甚至連 UDL 和 ODBC DSN 中的連接資訊也是如此。如果您在封裝建立後, 變更 UDL 和 ODBC DSN,則該變更不會對封裝造成影響。將封裝從開發 環境遷移至生產環境時,必須牢記這點。

使用 SQL Server 資料連接時,用本機來當作伺服器名稱,可使封裝在伺服器間較易移動, 因為伺服器的名稱是在封裝執行時進行解析的。這個方法的缺點是,封裝必須在 SQL Server 電腦本身上 執行及編輯。

您還可以使用 ActiveX 指令碼工作或包裝程式,在執行階段時修改封裝屬性。若要從封裝本身內部進行修改, 請在資料幫浦工作之前建立「ActiveX 指令碼」工作,並在封裝執行時進行修改。若要取得 封裝的控制代碼,請參考 DTSGlobalVariables.Parent。您可從這裡任意變更封裝屬性 (雖然需要一點程式設計的技巧)。

以下是《SQL 線上叢書》主題「ActiveX 指令碼工作」的範例,與如何使用 ActiveX 指令碼 來變更 DataSource 連接屬性相關:
   Function main()
   dim oPackage
   dim oConn

     'Get package object
     set oPackage = DTSGlobalVariables.parent
     'Get a handle to the desired connection.
     set oConn = oPackage.connections(1)
     'Modify the datasource.
     oConn.datasource = "newServerName"

     'Release object handles.
     set oPackage = nothing
     set oConn = nothing

    Main = DTSTaskExecResult_Success
End function
如果您想要有更多的控制權,而不在乎撰寫一些程式碼,請考慮在執行封裝前,用外部程式來修改封裝,或 從頭開始自行建立封裝。

若要建立程式來載入並修改封裝,請用「DTS 精靈」或「DTS 設計師」來建立封裝範本, 並加以儲存。請編寫 Visual Basic 程式來載入封裝並修改想要的屬性,然後呼叫封裝物件上的 Execute 方法 來執行封裝。

若要建立程式來自行產生封裝,請用「DTS 精靈」或「DTS 設計師」來建立封裝原型, ,並將其儲存到本機 SQL Server 中。請用下列「Microsoft 知識庫」文件中的 ScriptPkg 公用程式, 建立封裝程式碼的範本:
239454 INF: ScriptPkg Tool Generates DTS Object Model Code to Help Use DTS Programmatically
請用這個範本當作參考,編寫您自己的程式碼,根據使用者輸入產生封裝。

請注意,前述兩個情況中的 Visual Basic 專案都需要參考「Microsoft DTSPackage 物件程式庫」。

重要:從以 Visual Basic 編寫的程式中執行封裝,並監視封裝或工作事件時, 封裝中的所有步驟都一定要設定成在主執行緒上執行。這是因為 Visual Basic 具有一項限制, 使其無法在事件得到多重的同時呼叫時,正確地加以處理。

用全域變數控制封裝



只有 ActiveX 指令碼工作、「工作流程」指令碼和 ActiveX 轉換,才能使用全域變數。 全域變數無法直接用在 SQL 陳述式或連接屬性中,但是您可以使用 ActiveX 指令碼工作, 來修改以全域變數為基礎的「SQL 陳述式」或連接屬性。以下是 ActiveX 指令碼工作的範例, 以稱為 booktype 的全域變數來變更資料幫浦工作的「SQL 陳述式」:
Function Main()
   dim oPackage
   dim oPump

        'Get a handle to the Package object.
	set oPackage = DTSGlobalVariables.Parent
	'Get a handle to the desired Datapump Task.
	set oPump = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask   
	'Alter the datapump SQL statement.
	oPump.SourceSQLStatement = "select * from pubs..titles WHERE type _
  = ''" + DTSGlobalVariables("booktype") + "''"
	Main = DTSTaskExecResult_Success
End Function
注意:工作的說明會顯示在「DTS 設計師」中,但該說明不能直接用來參考 ActiveX 指令碼 中的工作。若要參考 ActiveX 指令碼的工作,應該使用工作的名稱。若要取得工作的名稱, 請查閱步驟名稱的工作流程屬性。工作的名稱與步驟相同,只有 Step 會用 Task 來取代。例如: DTSStep_DTSDataPumpTask_1 會變成 DTSTask_DTSDataPumpTask_1。

傳遞參數至 DTS 封裝



DTSRun 程式不接受任何可以在執行階段傳遞給封裝的命令列參數。若要在執行階段時,將 資訊傳遞給封裝,則必須從檔案讀取參數,或用程式設計的方式,從資料庫資料表查詢參數。

以下是「ActiveX 指令碼工作」的範例,此範例從文字檔讀取文字來設定全域變數。 這個全域變數可以再用來修改封裝行為,如本文的〈用全域變數控制封裝〉一節中所述。
Function main()
  Dim fso	'This will serve as a handle to a file system object.
  Dim ofile	'Handle for accessing a file.

    'Get a file system object for manipulation files.
    Set fso = CreateObject("Scripting.FileSystemObject")

    'Open the text file.
    Set ofile = fso.OpenTextFile("c:\test.txt")

    'Read line from the file into the global variable.
    DTSGlobalVariables("myGlobalVar").Value = ofile.ReadLine

    'Close the "parameter" file.
    ofile.Close

    Main = DTSTaskExecResult_Success
End function
以下範例顯示如何使用「ActiveX 指令碼」工作,從 SQL Server 資料表讀取參數。該程式碼 會讀取 my_param_table 中 paramvalue 欄位的值,並用它來設定全域變數。此範例使用「SQL 分散式管理物件」(DMO) 來 與 SQL Server 互動,但您可以使用「ActiveX 資料物件」(ADO) 或其他的資料存取方法達到相同的目的。
Function main()
Dim oServer 		'DMO Server object.
Dim oResult		'Result set.
Dim sParamValue

	'Create a SQLDMO server object.
	Set oServer =  CreateObject("SQLDMO.SQLServer")

	' Make a connection to the local server.
	oServer.Connect ".", "sa"

	'Select the desired row from the table.
	set oResult = oServer.Databases("pubs").ExecuteWithResults_
("select  paramvalue from  my_param_table")

	'Retrieve the first row, first column from the results.
	sParamValue = oResult.GetColumnString (1,1)

	'Set the global variable.
	DTSGlobalVariables("MyGlobalVar").Value = sParamValue

	Main = DTSTaskExecResult_Success
End function

以 Visual Basic 編寫自訂的 DTS 工作



您可以用 Visual Basic 來編寫自訂的 DTS 工作。您可在 SQL Server 光碟的 \Devtools\Samples\DTS 目錄中, 找到無介面的 Visual Basic 自定工作範例。 以下是在 DTS 中處理自訂的 Visual Basic 工作時,可能會遇到的一些常見問題:
  1. 以 Visual Basic 編寫的、執行 DTS.CustomTaskUI MUST 之類介面的自定工作, 必須執行介面中的每一個事件,否則便會造成「存取違規」。
  2. 如果您開發的 Visual Basic 自定工作具有介面,建議您最好套用 SQL Server Service Pack 1 (SP1)。 SP1 整合了數項增強功能,可簡化介面的開發工作。
  3. 「Visual Basic 工作」具有 Apartment 執行緒,而 DTS 則沒有執行緒。為了執行以 Visual Basic 所寫成的 工作,必須以主執行緒來執行該工作,否則便會造成「存取違規」。依預設值,DTS 會設定適當的旗標, 使用者請勿變更這個旗標。

取得如何編寫 DTS 封裝程式碼的相關資訊



在 SQL 7.0 光碟片的 \Devtools\Damples\DTS 資料夾中有數個範例,這其中包括了「自定工作」(Visual Basic) 及「自訂轉換」(C++) 的範例。自解壓縮的可執行檔 DTSDemo.exe 中也包括了數個封裝範例。

用途最廣的範例是 ScriptPkg,它是 Dtsdemo.exe 的一部分。ScriptPkg 包含 Visual Basic 原始程式碼, 可將儲存在本機伺服器的封裝轉換成 Visual Basic 程式碼。這個範例最適用下列用途:
  1. 透過編寫現有 DTS 封裝的指令碼,製造 Visual Basic 範例。
  2. 顯示如何編寫 DTS flatfile 驅動程式的程式碼,這項作業沒有記載在《SQL 線上叢書》中。
  3. 將封裝轉換成文字,以將其加入 SourceSafe 並加以追蹤。
以下是 ScriptPkg 範例的一些已知問題:
  1. 資料幫浦的查詢指令碼不正確。
  2. 如果封裝過大,則產生的文字就不能當成 Visual Basic 的一個函數,因為單一函數的行數有設限。 您必須自行將指令碼檔案分成多個函數,Visual Basic 才能編譯程式碼。

增進 DTS 封裝效能



使用平行載入



DTS 可以平行地執行多項工作,但是 DTS 封裝中的每個連接一次都只能處理一個執行緒。 這表示封裝中的下列資料幫浦都呈序列式:

A -> B 和 A -> B
A -> B 和 A -> C
A -> B 和 C -> B

無論您是否使用相同的圖示代表連接,都沒有差別。

唯一平行執行工作的方式,就是以不同的名稱,建立多個連接到相同的資料庫。 例如 A -> B 和 C -> D 會平行地執行,就算 B 和 D 是到相同伺服器和資料庫的不同連接,也是如此。

您可以使用優先順序限制,強制執行工作順序,並在必要時避免選定的工作平行執行。

插入基本配置大小



資料幫浦工作最重要的參數是 Insert Commit Size (插入基本配置大小)。這項屬性 只有在目的地是 SQL Server 時才有用,可用來控制在交易認可前,要大量地插入多少列。 依預設值的量是 0,而所有的列都是單一交易的一部分。這是最安全的設定,因為只要 發生錯誤,SQL Server 都可以復原所有變更。但是,這可能需要非常大的交易記錄檔; 在取消封裝時,回應時間會拖得很長,而當載入大量資訊時,如果造成失敗的是最後 那一列,更是使生產力更形降低。在認可資料列時,每個認可間隔結尾都會產生很明顯 的停頓。基本配置大小為 0 時,速度最快,但次快的值分別為 10,000、1000 和 1。1 這個值 很有用,因為失敗時只需復原一列。

請注意,如果插入基本配置大小為 0,則將錯誤計數設定為任何 > 1 的數目都不會有效果。 錯誤計數是計算有錯誤的交易數,而不是資料列數。

DTS 與分散式交易



DTS 封裝為支援 DTC 的提供者提供分散式交易的支援。DTC 服務必須正在執行,封裝及步驟交易才可使用 。此外,交易的每個提供者都必須支援 DTC。

封裝交易屬性是由封裝屬性的 [進階] 索引標籤來控制。

依預設值,封裝中的每個步驟都只控制自己的交易,而不會協調它在整個 DTC 過程中的交易。 若要將工作列入 DTC 交易,您必須在工作的工作流程屬性中,設定 [如果存在,則聯結交易] 核取方塊。 工作的其他 DTC 交易選項還有 [當這個步驟順利完成時認可交易] 以及 [失敗時將交易復原]。

請注意封裝不支援 Microsoft Transaction Server (MTS)。

錯誤訊息



當您使用某資料庫伺服器當作某封裝所連接的「本機」,而稍後又有人從另一台伺服器對該封裝進行編輯, 且該人員想要查看所做的轉換時,便會出現下列的錯誤訊息:
Error Source : Microsoft OLE DB Provider for SQL Server Error Description : Cannot open database requested in login 'xxxxxxx'. Login fails."
(錯誤來源:Microsoft OLE DB Provider for SQL Server 錯誤說明:無法開啟登入者 'xxxxxxx' 所要求的資料庫。登入失敗。)

?考

本文件是根據 Microsoft Knowledgebase 文件編號 Q242391 翻譯的. 若要參考原始英文文件內容, 請至以下網址:

http://support.microsoft.com/support/kb/articles/Q242/3/91.asp

屬性

文章編號: 242391 - 上次校閱: 2004年3月11日 - 版次: 2.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
關鍵字:?
kbinfo KB242391
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com