通过SQL AGENT作业运行SSIS包

时间:2015-02-27 06:44:44

标签: c# .net sql-server excel ssis

我对SSIS很好,我创建了一个包,它将excel文件加载到SQL SERVER表中。

我编写了C#代码以仅提取第一个工作表名称,然后包将加载第一个工作表中的数据(仅限)。

当我通过BIDS运行时,包运行正常。但是当我通过SQL AGENT JOB运行此包时,同一个包在C#代码步骤中抛出错误。

我看过很多帖子表明这可能是因为在c#代码中使用了Microsoft.interop.excel引用。

在C#中是否有任何替代方法可以使用inter-op库提取excel文件的第一个工作表名称(不是基于升序)。

或者,在代码中使用inter-op时,如何配置SQL AGENT作业以便成功运行?

我的服务器是64位。

我尝试在“C:\ Windows \ System32 \ config \ systemprofile \”中创建“桌面”文件夹

  

错误:描述:System.Reflection.TargetInvocationException:   调用的目标抛出了异常。 --->   System.NullReferenceException:未将对象引用设置为实例   一个对象。在   ST_ecfa668f250a45e18c95639c9ffd64d4.csproj.ScriptMain.Main()---   内部异常堆栈跟踪结束--- at   System.RuntimeMethodHandle._InvokeMethodFast(Object target,Object []   参数,SignatureStruct& sig,MethodAttributes methodAttributes,   RuntimeTypeHandle typeOwner)at   System.RuntimeMethodHandle.InvokeMethodFast(Object target,Object []   arguments,Signature sig,MethodAttributes methodAttributes,   RuntimeTypeHandle typeOwner)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化,   布尔值skipVisibilityChecks)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)
  在System.RuntimeType.InvokeMember(String name,BindingFlags   bindingFlags,Binder binder,Object target,Object [] providedArgs,   ParameterModifier []修饰符,CultureInfo文化,String []   System.Type.InvokeMember(String name,BindingFlags)中的namedParams   invokeAttr,Binder binder,Object target,Object [] args,CultureInfo   文化)   Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()   结束错误错误:2015-02-27 11:24:00.23代码:0x00000001
  来源:用户邮件说明:   System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。 --->   System.Data.SqlClient.SqlException:与网络相关或   建立连接时发生特定于实例的错误   SQL Server。服务器未找到或无法访问。校验   实例名称正确且SQL Server配置为   允许远程连接。 (提供者:命名管道提供商,错误:40 -   无法打开到SQL Server的连接   System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj)在System.Data.SqlClient.TdsParser.Connect(ServerInfo   serverInfo,SqlInternalConnectionTds connHandler,Boolean   ignoreSniOpenTimeout,Int64 timerExpire,Boolean encrypt,Boolean   trustServerCert,Boolean integratedSecurity,SqlConnection   拥有对象)   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo   serverInfo,String newPassword,Boolean ignoreSniOpenTimeout,Int64   timerExpire,SqlConnection owningObject)at   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(字符串   host,String newPassword,Boolean redirectedUserInstance,   SqlConnection owningObject,SqlConnectionString connectionOptions,   Int64 timerStart)at   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(的SqlConnection   owningObject,SqlConnectionString connectionOptions,String   newPassword,Boolean redirectedUserInstance)at   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity   identity,SqlConnectionString connectionOptions,Object providerInfo,   String newPassword,SqlConnection owningObject,Boolean   redirectedUserInstance)at   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions   options,Object poolGroupProviderInfo,DbConnectionPool池,   DbConnection owningConnection)at   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(的DbConnection   owningConnection,DbConnectionPool池,DbConnectionOptions选项)   在System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection   拥有...包执行...步骤失败

C#代码 -

using System;
using System.Data;
using System.Diagnostics;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
using Microsoft.Office.Interop;
using System.Runtime.InteropServices;

namespace ST_ecfa668f250a45e18c95639c9ffd64d4.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion


        public void Main()
        {   /*Passing the file path via User::File_Name Variable*/
            string FileName = Dts.Variables["User::File_Name"].Value.ToString();
            Microsoft.Office.Interop.Excel.Application xlApp = null;
            Microsoft.Office.Interop.Excel.Workbook excelBook = null;
            try
            {
                xlApp = new Microsoft.Office.Interop.Excel.Application();
                excelBook = xlApp.Workbooks.Open(FileName, Type.Missing,
                                                Type.Missing, Type.Missing, Type.Missing,
                                                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                                                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                                                Type.Missing, Type.Missing);
                string[] excelSheets = new string[excelBook.Worksheets.Count];
                int i = 0;
                foreach (Microsoft.Office.Interop.Excel.Worksheet wSheet in excelBook.Worksheets)
                {
                    excelSheets[i] = wSheet.Name;
                    i++;
                }
                Dts.Variables["User::WorkSheetName"].Value = excelSheets[0] + "$";
            }
            catch (Exception ex)
            {
                excelBook.Close(false, FileName, null);
                Marshal.ReleaseComObject(excelBook);
                string error = ex.Message;
            }
            finally
            {
                excelBook.Close(false, FileName, null);
                Marshal.ReleaseComObject(excelBook);
            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

尝试创建此文件夹:C:\Windows\SysWOW64\config\systemprofile\Desktop

See this link for more details

答案 1 :(得分:0)

您必须在32位计算机上运行BIDS,这就是程序包运行成功的原因。在您的UAT服务器上,请将程序包配置为在SQL作业步骤中以32位模式运行。为此,请修改已配置SSIS包的SQL作业步骤 -

1)转到执行选项标签

2)针对使用32位运行时

选择复选框

它应该可以解决您的问题。

答案 2 :(得分:-2)

目标是拥有一个带有C3脚本的SQL作业SSIS包,该脚本可以在网络共享上动态创建Excel文件。我能够使用代理帐户通过SQL Server Directly从ssisdb运行包。但是没能成为一份工作。最后,经过长时间的挫折。感谢以下链接success