我对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;
}
}
}
答案 0 :(得分:1)
尝试创建此文件夹:C:\Windows\SysWOW64\config\systemprofile\Desktop
答案 1 :(得分:0)
您必须在32位计算机上运行BIDS,这就是程序包运行成功的原因。在您的UAT服务器上,请将程序包配置为在SQL作业步骤中以32位模式运行。为此,请修改已配置SSIS包的SQL作业步骤 -
1)转到执行选项标签
2)针对使用32位运行时
选择复选框它应该可以解决您的问题。
答案 2 :(得分:-2)
目标是拥有一个带有C3脚本的SQL作业SSIS包,该脚本可以在网络共享上动态创建Excel文件。我能够使用代理帐户通过SQL Server Directly从ssisdb运行包。但是没能成为一份工作。最后,经过长时间的挫折。感谢以下链接success。