![](/img/trans.png)
[英]SSIS Package fails when called from task scheduler via a batch file because of a script task
[英]SSIS package fails on file.delete of script task
我有一個SSIS package , zip.dtsx。 這個 package 在 serverA 上成功運行。 我在serverB中復制了這個package。 但是,當我嘗試在 serverB 上運行 zip.dtsx 時,它失敗了。
zip.dtsx 只是讀取源文件夾中的文件,對其進行壓縮,將壓縮文件保存到不同的文件夾,然后刪除源文件夾中的原始文件。
經過一番調查,我發現如果我注釋掉 C# 腳本任務中刪除源文件夾中文件的部分。 package 運行成功。
我需要刪除源文件夾中的文件。 否則,這個文件只會被重復加載到數據庫中。 我已經按照這里的建議重新添加了腳本任務引用,但我仍然無法使file.delete
成功運行。
public void Main()
{
String sourcePath = Convert.ToString(Dts.Variables["SourcePath"].Value);
String namePart = Convert.ToString(Dts.Variables["NamePart"].Value);
String destinationPath = Convert.ToString(Dts.Variables["DestinationPath"].Value);
FileStream sourceFile = File.OpenRead(@sourcePath + namePart);
FileStream destFile = File.Create(@destinationPath + namePart);
GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);
try
{
int theByte = sourceFile.ReadByte();
while (theByte != -1)
{
compStream.WriteByte((byte)theByte);
theByte = sourceFile.ReadByte();
}
}
finally
{
compStream.Dispose();
sourceFile.Close();
destFile.Close();
File.Delete(@sourcePath + namePart);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
更新:
在此處嘗試完全相同的代碼后。 並發現此代碼刪除了我在源文件夾中的文件,我嘗試更新我的代碼以遵循鏈接中刪除文件的方式。 但是,它仍然沒有工作。 下面是我如何更新我的代碼。
String sourcePath = Convert.ToString(Dts.Variables["SourcePath"].Value);
String namePart = Convert.ToString(Dts.Variables["NamePart"].Value);
String destinationPath = Convert.ToString(Dts.Variables["DestinationPath"].Value);
FileStream sourceFile = File.OpenRead(@sourcePath + namePart);
FileStream destFile = File.Create(@destinationPath + namePart);
GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);
try
{
int theByte = sourceFile.ReadByte();
while (theByte != -1)
{
compStream.WriteByte((byte)theByte);
theByte = sourceFile.ReadByte();
}
}
finally
{
compStream.Dispose();
sourceFile.Close();
destFile.Close();
FileInfo currFileInfo = new FileInfo(@sourcePath + namePart);
currFileInfo.Delete();
我終於搞清楚了。
為了解釋整個情況,我們有一個完全運行的sqlserver,serverA。 我們想在serverB上復制它,以便我們可以在serverB上有一個測試環境。 已經在serverB上恢復了必要的數據庫,剩下的就是SSIS包和SQL Server代理作業。
將文件內容加載到DB的主程序包(main.dtsx)失敗。
從Integration Services目錄 - >目錄文件夾 - >右鍵單擊 - >報告 - >所有執行,我了解到從main.dtsx調用的Zip.dtsx失敗了。 Zip.dtsx壓縮訪問的文件,將其歸檔並從源文件夾中刪除它。
在使用Zip.dtsx中的腳本任務(我從Kannan Kandasamy的評論中得到的一個想法)之后,我發現它位於我的腳本任務失敗的File.delete()
部分。 當然,人們會認為這是一個許可問題。
我的第一個錯誤是我在執行Zip.dtsx時繼續播放我的腳本任務,右鍵單擊 - > Visual Studio上的執行任務。 我一直在我的上一篇文章中獲取運行時錯誤屏幕,但沒有意識到我得到它,因為我使用的是由main.dtsx傳遞給zip.dtsx的包變量。 我把它掛了,直到我想到為什么當我用我的硬編碼路徑名替換變量時腳本任務成功運行。
我的第二個錯誤是用我的硬編碼路徑替換Zip.dtsx的包變量。 直到最后,我意識到Zip.dtsx訪問的文件夾是serverB中的本地文件夾,我在本地機器上運行SQL Server代理作業 ,比如machineA。 所以,我將serverB本地文件夾共享到我的用戶帳戶。 出於某種原因,這嚴重搞砸了我的包,它不再看到文件夾中的文件,因此我的包成功運行,因為它找到文件夾為空。
主要解決方案:
我更改了我對Zip.dtsx所做的更改,並刪除了將serverB的本地文件夾共享到我的用戶帳戶,而是添加了NT Service \\ SQL $ Instance,以完全控制腳本任務刪除文件的源文件夾。 請參閱此鏈接以檢查如何將SQLServer $ Instance添加到文件夾權限設置。
我遇到的其他問題是:
當從不同的服務器傳輸包並且包失敗時,我認為這也很重要 。 我也做了這一步。 但是在serverB中,我找不到Microsoft.SQLServer.ManagedDTS.dll。 我做的是將這個dll從serverA復制到serverB 。 還要檢查系統路徑以查看默認情況下使用的Microsoft SQL Server工具版本,並確保這是您在腳本任務中引用的內容。
在某些時候,在調查時,我在查看Integration Services Catalog的All Executions報告時遇到錯誤。 我通過轉到C:\\ Temp文件夾解決了這個問題。 當我雙擊它以訪問它時,會出現一個對話框,我當前無權訪問。 我繼續點擊對話框中的“繼續”按鈕。 之后,All Executions Report再次運行。 我從SSMS得到的錯誤是,
標題:Microsoft SQL Server Management Studio
本地報告處理期間發生錯誤。 (Microsoft.ReportViewer.WinForms)
- - - - - - - - - - - - - - - 附加信息:
報告的定義''無效。 (Microsoft.ReportViewer.Common)
編譯表達式時發生意外錯誤。 本機編譯器返回值:'[BC2001]文件'C:\\ Windows \\ TEMP \\ mpgc21o3.0.vb'找不到'。 (Microsoft.ReportViewer.Common)
- - - - - - - - - - - - - - - 紐扣:
好
我不確定這對我的情況有多重要,但是如果有人遇到同樣的問題,我會分享它。 我是MS SQL Server的初學者,所以我認為這可能會幫助像我這樣的初學者。
好工作。 我能夠解決我在 dtsx 文件中遇到的問題,我將所有項目復制到新服務器,並將它們全部升級。 然后不斷收到連接錯誤。 我注意到版本號仍在屬性中的“UserComponentTypeName”中使用舊版本號,我在 dtsx xml 文件中進行了查找和替換,然后繁榮。 有效。 謝謝你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.