摘要:[SSIS]動態連結EXCEL資料來源
先解釋一下要做到的需求
--------------------------------------------------------------------------------------------------------
原本已經有一個將EXCEL資料匯入到資料庫中的封裝,
因為是預算的EXCEL資料,所以現在就要匯入預測明年1月的資料
而原本在資料來源的部份是使用Excel來源,只能固定一個檔案
但是現在又必需同時匯入09跟10年的資料,
雖然說複製一份原本的再修改一下資料來源幾乎就可以了
但是覺得這樣不就每年都要再做這件事~感覺很蠢
所以就要想一個辦法能夠把所有EXCEL的檔案都匯入的方法
--------------------------------------------------------------------------------------------------------
想法
第一個直覺就是想到用FOREACH去抓資料夾中EXCEL的檔案
FOREACH設定,在集合頁籤選檔案列舉,抓file開頭的.xls檔(這裡可以設定*字元搜尋喔),放到參數strFile
再來就是設定DataFlowTask,這裡用指令碼元件當作資料來源,
拉進指令碼元件會先選擇「來源」、「目的地」還是「轉換」的用途
再來就是設定指令碼元件的一些屬性
傳入的參數設為用FOREACH抓出來的檔案名稱
另外要注意的是因為2008改為precompiler的模式,所以要使用的語言要先選擇好
我這裡是用VB,若要使用C#要先在這裡修改,不然等等點進編輯指令碼就來不及了
(若是要設定自己預設使用的語言也可以到「工具」->「選項」->「商業智慧設計師」(要選項若是沒看到請勾選顯示所有設定)->
「Intergration Services 設計師」->「一般-語言」調整 )
若是為來源,就要先設定輸出的欄位
點加入資料行,這裡要填上輸出欄位的名稱跟資料型態
另外要注意我選取的Out名稱,這個會是在程式中設定欄位算是做Namespace的名稱
再來就開始寫程式了,進入到VSTA的編輯畫面,在PreExecute將EXCEL的資料放到宣告的dt裡
02 MyBase.PreExecute()
03 '
04 ' Add your code here for preprocessing or remove if not needed
05 '
06 Dim strFile As String = Variables.strFileName.Trim
07 Dim myxls As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFile + ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
08 xls_conn = New OleDb.OleDbConnection(myxls)
09 Dim strSQL As String = String.Empty
10 strSQL = "SELECT * FROM [file01$]"
11 Dim command_oledb As OleDb.OleDbCommand = New OleDb.OleDbCommand(strSQL, xls_conn)
12 Dim adap_oledb As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(command_oledb)
13 xls_conn.Open()
14 ds = New DataSet
15 adap_oledb.Fill(ds, "ReadData")
16 dt = ds.Tables("ReadData")
17
18
19 End Sub
在CreateNewOutputRows裡指定輸出各欄位的值,OutBuffer就是剛剛設定的"Out"+"Buffer"
註解上也會有解釋
02 '
03 ' Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
04 ' For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
05 '
06 With OutBuffer
07
08 For Each dr As DataRow In dt.Rows
09 .AddRow()
10 .AAA = dr.Item(0).ToString
11 .BBB = dr.Item(1).ToString
12 .CCC = dr.Item(2).ToString
13 .DDD = dr.Item(3).ToString
14 Next
15 .EndOfRowset()
16
17 End With
18 End Sub
這樣做完之後,我們就有一個資料來源了,而datasource也是由strFileName這個參數傳入
這樣我們就有一個動態的資料來源了
再來就看要轉到什麼目的地的
解釋一下為什麼要使用指令碼元件
因為如果使用原本的EXCEL來源,似乎只能傳入固定的檔案名稱,沒辦法使用參數
所以才想到要用指令碼元件來做