2015-09-03 225 views
2

我有一個SSIS包會從一組Excel文件加載數據,然後將這些文件歸檔到指定的文件夾。執行腳本任務拋出錯誤「包執行返回DTSER_FAILURE(1)」

Excel的文件存儲在一個文件夾,並且該文件夾裏面我有存檔文件夾。

下面是引用我的腳本任務的代碼。

public void Main() 
     { 
      // TODO: Add your code here 
      string sourceDir = Dts.Variables["User::strFilePath"].Value.ToString(); 
      string destDir = Dts.Variables["User::strArchivePath"].Value.ToString(); 

      DirectoryInfo di = new DirectoryInfo(sourceDir); 
      string[] sDirFiles = Directory.GetFiles(sourceDir); 
      FileInfo[] fi = di.GetFiles("*.xls"); 
      int fileCnt = fi.Length; 
       for (int i = 0; i < fileCnt; i++) 
       { 
        String filename = fi[i].Name; 
        string[] splitFilename = filename.Split('.'); 

        DateTime dt = DateTime.Now; 
        string ArchiveDate = String.Format("{0:ddMMMyyyy}", dt); 

        string sourceFileName = filename; 
        string sourceFilePath = sourceDir + filename; 
        string destinationFileName = splitFilename[0] + '_' + ArchiveDate + '.' + splitFilename[1]; 
        string destinationPath = destDir + destinationFileName; 


        //MessageBox.Show("Source File " + sourceFilePath + " to destination " + destinationPath); 
        if (File.Exists(destinationPath)) 
         File.Delete(destinationPath); 
        // To move a file or folder to a new location: 
        System.IO.File.Move(sourceFilePath, destinationPath); 
       } 
      Dts.TaskResult = (int)ScriptResults.Success; 
     } 

sourceDir和destDir是提供源文件文件夾和歸檔文件夾路徑的變量。當我從Visual Studio運行它時,該包工作正常。

我已經部署了其爲使用部署工具創建清單文件運行作業。當我運行這個工作時,我的檔案腳本任務出現錯誤。下面是它的截圖。

enter image description here

我搜索解決方案,但是計算器所提供的解決方案並沒有解決我的問題。

Problem using SQL Agent to run SSIS Packages - fails with 「DTSER_FAILURE(1)」

DTSX package runs in Visual Studio but not when called from a Database Job

我已經授予了這兩個文件夾SQL服務器讀寫訪問。仍然得到相同的錯誤?

任何幫助,高度讚賞。

+0

是您的數據庫服務器或SSIS服務器上安裝Excel?Excel和SSIS令人頭痛等待發生。盡你所能將文件轉換爲平面格式。 – saarrrr

+0

@saarrrr我沒有與Excel的任何問題,因爲我的任務與Excel相關的工作正常工作,他們需要的方式。我只在上面的腳本任務中遇到問題。 –

回答

0

我替換文件系統任務的腳本任務和它的工作。我還創建了一個代理帳戶,以使用我的系統憑據運行該程序包,以便它可以訪問指定的文件夾。

把在運行SQL作業創建代理帳戶的步驟,這樣它會爲用戶尋找出它的幫助..

創建SQL用戶帳戶下,你需要運行工作 爲創建的用戶帳戶創建憑據。

--Script #1 - Creating a credential to be used by proxy 
USE MASTER 
GO 
--Drop the credential if it is already existing 
IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = N'SSISProxyCredentials') 
BEGIN 
DROP CREDENTIAL [SSISProxyCredentials] 
END 
GO 
CREATE CREDENTIAL [SSISProxyCredentials] 
WITH IDENTITY = N'<Insert the Username>', 
SECRET = N'[email protected]' 
GO 

創建代理賬戶和關聯創建

--Script #2 - Creating a proxy account 
USE msdb 
GO 
--Drop the proxy if it is already existing 
IF EXISTS (SELECT 1 FROM msdb.dbo.sysproxies WHERE name = N'SSISProxyDemo') 
BEGIN 
EXEC dbo.sp_delete_proxy 
@proxy_name = N'SSISProxyDemo' 
END 
GO 
--Create a proxy and use the same credential as created above 
EXEC msdb.dbo.sp_add_proxy 
@proxy_name = N'SSISProxyDemo', 
@credential_name=N'SSISProxyCredentials', 
@enabled=1 
GO 
--To enable or disable you can use this command 
EXEC msdb.dbo.sp_update_proxy 
@proxy_name = N'SSISProxyDemo', 
@enabled = 1 [email protected] = 0 
GO 

憑據授予代理帳戶SQL Server代理子系統

USE msdb 
GO 
--You can view all the sub systems of SQL Server Agent with this command 
--You can notice for SSIS Subsystem id is 11 
EXEC sp_enum_sqlagent_subsystems 
GO 

--Grant created proxy to SQL Agent subsystem 
--You can grant created proxy to as many as available subsystems 
EXEC msdb.dbo.sp_grant_proxy_to_subsystem 
@proxy_name=N'SSISProxyDemo', 
@subsystem_id=11 --subsystem 11 is for SSIS as you can see in the above image 
GO 
--View all the proxies granted to all the subsystems 
EXEC dbo.sp_enum_proxy_for_subsystem 

授予安全主體代理訪問

USE msdb 
GO 
--Grant proxy account access to security principals that could be 
--either login name or fixed server role or msdb role 
--Please note, Members of sysadmin server role are allowed to use any proxy 
EXEC msdb.dbo.sp_grant_login_to_proxy 
@proxy_name=N'SSISProxyDemo' 
,@login_name=N'<Insert the Username>' 
--,@fixed_server_role=N'' 
--,@msdb_role=N'' 
GO 
--View logins provided access to proxies 
EXEC dbo.sp_enum_login_for_proxy 
GO 

最後將代理帳戶關聯到程序包步驟。這也可以通過作業嚮導完成。

EXEC msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'SSISPackageCall', 
@step_id=1, 
@cmdexec_success_code=0, 
@on_success_action=1, 
@on_success_step_id=0, 
@on_fail_action=2, 
@on_fail_step_id=0, 
@retry_attempts=0, 
@retry_interval=0, 
@os_run_priority=0, @subsystem=N'SSIS', 
@command=N'/FILE "C:\Package.dtsx" /CHECKPOINTING OFF /REPORTING E', 
@database_name=N'master', 
@flags=0, 
@proxy_name = N'SSISProxyDemo'; 

感謝我的崗位了寶貴的答覆..

0

嘗試在你的項目中選擇64位 - >屬性 - > Dubugging - > Run64BitTime這個問題會得到解決。

+0

我試過了。已經。運行時選項保持爲32位以及64位。然而它不能解決我的問題。我跳這與訪問問題有關。 –

相關問題