首页 > 解决方案 > 访问数据库连接参数时 SSIS 作业失败

问题描述

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

数据库连接管理器

连接管理器参数表达式

数据库连接属性

参数定义

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

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 不是我的菜。

请帮忙。

标签: c#sql-serverssisado.netparameter-passing

解决方案


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

    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
}

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

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

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


推荐阅读