Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS C#脚本任务错误_C#_Ssis - Fatal编程技术网

SSIS C#脚本任务错误

SSIS C#脚本任务错误,c#,ssis,C#,Ssis,总之,我使用的是SQL 2014和Visual Studio 2013 我有一个脚本任务没有启动。正在阅读,但不起作用。此任务创建表并将数据插入其中。我需要用一个脚本任务来完成这项工作,因为有100个TSV文件,字段可能会每月更改,维护每个表的各个节点是一件痛苦的事情 如果您查看代码片段,消息框(1)确实会启动,但脚本错误就在后面-我相信在(2)处: 错误消息是: 我认为这个错误指的是任务中无法访问的变量,或者拼写错误,等等。我已经检查了这些异常的变量,但我不这么认为 非常感谢您的帮助。谢谢

总之,我使用的是SQL 2014和Visual Studio 2013

我有一个脚本任务没有启动。正在阅读,但不起作用。此任务创建表并将数据插入其中。我需要用一个脚本任务来完成这项工作,因为有100个TSV文件,字段可能会每月更改,维护每个表的各个节点是一件痛苦的事情

如果您查看代码片段,消息框(1)确实会启动,但脚本错误就在后面-我相信在(2)处:

错误消息是:

我认为这个错误指的是任务中无法访问的变量,或者拼写错误,等等。我已经检查了这些异常的变量,但我不这么认为


非常感谢您的帮助。谢谢。

代码中的问题是您正在脚本代码中创建一个ADO.NET(C#标准)连接,但该连接管理器的基础--
DBconn
是一个OLEDB连接管理器。这两个连接不能相互铸造

建议:

  • 如果可能,将连接管理器创建为ADO.NET。那么你的代码应该可以工作了
  • 如果必须保持
    DBconn
    作为OLEDB连接管理器,则必须基于
    DBconn
    在脚本任务中创建
    SqlConnection
    连接。我已经从OLEDB conn字符串为ADO.NET构建了连接字符串,并使用该连接字符串创建了一个新的
    SqlConnection
下面是生成连接字符串的函数的代码示例

using RuntimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Data.OleDb;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Runtime;

static string Get_ManagedConnString(string Src_Name, ConnectionManager CM)
    {
    if (CM.CreationName != "OLEDB")
        throw new Exception(string.Format("Cannot get Conn String from non-OLEDB Conn manager {0}", CM.Name));

    RuntimeWrapper.IDTSConnectionManagerDatabaseParameters100 cmParams_Src = CM.InnerObject as RuntimeWrapper.IDTSConnectionManagerDatabaseParameters100;
    OleDbConnection oledbConn_Src = cmParams_Src.GetConnectionForSchema() as OleDbConnection;
    OleDbConnectionStringBuilder oledbCSBuilder_Src = new OleDbConnectionStringBuilder(oledbConn_Src.ConnectionString);
    SqlConnectionStringBuilder sqlCSBuilder_Src = new SqlConnectionStringBuilder();
    sqlCSBuilder_Src.DataSource = oledbCSBuilder_Src["Data Source"].ToString();
    sqlCSBuilder_Src.InitialCatalog = oledbCSBuilder_Src["Initial Catalog"].ToString();
    if (oledbCSBuilder_Src["integrated security"].ToString() == "SSPI")
        {
        sqlCSBuilder_Src.IntegratedSecurity = true;
        }
    else
        {
        sqlCSBuilder_Src.UserID = oledbCSBuilder_Src["User ID"].ToString();
        sqlCSBuilder_Src.Password = oledbCSBuilder_Src["Password"].ToString();
        }

    return sqlCSBuilder_Src.ConnectionString;
    }

我应该重新表述这个问题吗?有什么建议吗?问题是我有一个oledb连接和一个ADO连接同时发生吗?您的错误会说明集合中缺少元素,并且看起来像是在访问变量时发生的。如果注释掉所有对变量的引用,是否仍会引发异常?尝试在脚本任务的第一行设置一个断点,并逐步执行,直到它崩溃,以确定位置。您的连接管理器是ADO.NET还是OLEDB?好的,谢谢。连接是OLE DB。感谢您的详细响应和解决方法。这就足够了——奇怪的是,第三种解决方案是创建另一个ADO连接并在上面的C#脚本中引用该新连接吗(将DBconn换成DBconnADO?@Craig,当然可以。对于一次性软件包来说是可以的,但是对于长期支持——不是;在生产中维护这些东西可能会随着时间的推移而中断。这就是为什么我更喜欢为一个源定义一个连接管理器,并从中派生出来。