访问数据库连接参数时 SSIS 作业失败

Posted

技术标签:

【中文标题】访问数据库连接参数时 SSIS 作业失败【英文标题】:SSIS Job failing when accessing DB connection parameter 【发布时间】:2021-11-07 14:26:27 【问题描述】:

我有一个 SSIS 包,它试图将 csv 文件中的信息加载到 SQL Server 表中。 DB 连接被定义为 ADO.NET 连接,我已经参数化了连接字符串。请参阅下面的屏幕截图。

下面是我在C#脚本任务中用来建立数据库连接的代码sn-p。

SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["$Package::SAMDBConnection"].AcquireConnection(Dts.Transaction) as SqlConnection);

代码和整个项目的构建没有任何问题。但是,当我运行包时,我收到以下错误消息。

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error 
occurred while establishing a connection to SQL Server. The server was not found or was not 
accessible. Verify that the instance name is correct and that SQL Server is configured to 
allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating 
Server/Instance Specified)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, 
SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String 
newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, 
SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool 
pool, String accessToken, Boolean applyTransientFaultHandling, 
SqlAuthenticationProviderManager sqlAuthProviderManager)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, 
DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection 
owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, 
DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, 
DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, 
DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, 
DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, 
UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, 
DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, 
TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& 
connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection 
owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, 
DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection 
outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, 
DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, 
DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions 
userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Microsoft.SqlServer.Dts.Runtime.ManagedHelper.GetManagedConnection(String 
assemblyQualifiedName, String connStr, Object transaction)
at Microsoft.SqlServer.Dts.Runtime.ConnectionManager.AcquireConnection(Object txn)
at ST_1d4a35a96e484ef884dbd7beb30de13d.ScriptMain.Main()
ClientConnectionId:00000000-0000-0000-0000-000000000000
Error Number:-1,State:0,Class:20

有人可以帮忙吗?当我双击包中的 SAMDBConnection 连接管理器并单击“测试连接”按钮时,我收到相同的错误消息。如果我不使用参数化,则连接成功,并且连接到硬编码数据库没有任何问题。但是,这不是一个选项,因为我需要将作业部署到多个 SSIS 服务器(Dev、QA 和 PROD)中,并且我需要参数化连接参数。我将使用 Microsoft Azure TFS 构建和发布管道来构建包并将其部署到多个 SSIS 服务器中。我需要提供数据库连接参数作为此作业的发布定义的一部分。

我注意到的一个变化是我正在使用语句 Dts.Variables["$Package:FileDelimiter"].Value 访问其他变量,在这种情况下,我将其作为 Dts.Connections["$Package:: SAMDBConnection"].AcquireConnection,我不确定这是否正确。

抱歉,帖子太长了。我是 Salesforce 人员,SSIS 不是我的菜。

请帮忙。

【问题讨论】:

您是使用斜线来分隔服务器名称和实例名称,还是使用反斜线?您是否尝试过使用ServerNameOrIpAddress\InstanceName 而不是ServerNameOrIpAddress/InstanceName 我正在使用反斜杠。这就是我连接到 SSMS 的方式。 您在混合使用 ADO 和 SqlClient 连接吗?你所拥有的一切看起来都像一个 SqlClient 连接,但你一直在引用 ADO。 【参考方案1】:

连接管理器的名称没有改变,所以

myADONETConnection = (SqlConnection)(Dts.Connections["$Package::SAMDBConnection"].AcquireConnection(Dts.Transaction) as SqlConnection);

应该是

myADONETConnection = (SqlConnection)(Dts.Connections["SAMDBConnection"].AcquireConnection(Dts.Transaction) as SqlConnection);

【讨论】:

谢谢,我会试试这个。当我为 DEV、QA 和 PROD 服务器运行发布管道时,它是否会自动引用正确的值? 这不起作用。当我在属性中硬编码连接名称时,它似乎正在工作(将表达式设置为 false)。但是,我需要对连接字符串使用变量表达式,以便在部署期间将其设置为不同的值。【参考方案2】:

我还看到您正在使用脚本任务来建立连接。试试这个模式...

    public static bool moreToProcess()
    
        string sql = @"select Count(*) Ct from yourTable where isProcessed = 0"; //Example

        using (SqlConnection conn = new SqlConnection([connString]))
        
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            
                cmd.CommandType = CommandType.Text;
                conn.Open();
                return (int)cmd.ExecuteScalar() > 0 ? true : false;
            
        
    

这是一个代码检查表中是否有更多记录要处理的示例。它可以像这样从 main 调用。

while(moreToProcess())

    //do some work

为您的查询使用一个类确实...

    简化代码的主要部分 允许使用一致的代码模式来查找错误 通过包装 using 语句在完成时关闭打开的连接

注意: 将 [connString] 替换为连接字符串的文字 string 值。

【讨论】:

以上是关于访问数据库连接参数时 SSIS 作业失败的主要内容,如果未能解决你的问题,请参考以下文章

SAS IOM 数据提供程序 - 拒绝访问 - SSIS 连接 [关闭]

在SSIS包中使用AD服务帐户

通过 SSIS 访问 Oracle 视图时出错

在SSIS任务中避免使用Jade Db源连接超时

从SQL Server代理作业步骤调用时,SSIS包不会运行

为什么我的ODBC连接在Visual Studio中运行SSIS加载时失败,而在使用Execute Package Utility运行相同的包时则失败