c# - 访问数据库连接参数时 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 不是我的菜。
请帮忙。
解决方案
我还看到您正在使用脚本任务来建立连接。试试这个模式...
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] 替换为连接字符串的文字字符串值。
推荐阅读
- c - 在 C 中转换无符号 64 位数字的字节顺序问题
- regex - 正则表达式匹配同一行中的多个值
- javascript - Next JS Layout 组件,将 props 传递给 children
- javascript - R Shiny Dashboard valueBox:从一个数字到另一个数字的动画
- python - 当我尝试对数据帧执行一些逻辑操作时,为什么会出现此错误?
- c# - LINQ 查询中左外连接子句的多个条件
- java - 如何通过 NIO ServerSocketChannel 实现 REST 和安全连接(证书)
- filter - 样式层取决于多个特征属性
- powershell - Powershell 似乎异步运行语句?
- java - Gradle Kotlin、Cucumber 和 OKHttp