SSIS脚本任务中访问OLEDB连接管理器报错,如何获取数据库服务器名
解决SSIS脚本任务获取数据库服务器名并赋值给项目变量的问题
别担心,我来帮你搞定这个问题!首先咱们先分析你遇到的错误:你代码里用了OleDbConnection,但错误提示里提到无法将COM对象转成SqlConnection,这大概率是因为你的连接管理器类型和代码里的类型不匹配,或者旧版接口的兼容性问题。其实不用绕COM对象转换的弯路,直接解析连接字符串来获取服务器名会更简单可靠。
下面是具体的实现步骤和代码示例:
步骤1:准备工作
在脚本任务的配置界面,记得把你要赋值的项目变量(比如$Project::ServerName)添加到ReadWriteVariables列表里,这样脚本才能有权限修改它。
步骤2:根据连接管理器类型选择代码
情况1:你的连接管理器是SQL Server类型(非OLEDB)
用SqlConnectionStringBuilder来解析连接字符串,获取服务器名:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Data.SqlClient; namespace ST_XXXXXXXXX { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { string serverName = string.Empty; // 替换成你的连接管理器名称 ConnectionManager cm = Dts.Connections["YourSQLServerConnection"]; // 获取连接字符串 string connStr = cm.ConnectionString; // 解析连接字符串提取服务器名 SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(connStr); serverName = connBuilder.DataSource; // 赋值给项目变量 Dts.Variables["$Project::ServerName"].Value = serverName; Dts.TaskResult = (int)ScriptResults.Success; } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; } }
情况2:你的连接管理器是OLEDB类型
用OleDbConnectionStringBuilder来解析:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Data.OleDb; namespace ST_XXXXXXXXX { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { string serverName = string.Empty; // 替换成你的OLEDB连接管理器名称 ConnectionManager cm = Dts.Connections["YourOLEDBConnection"]; string connStr = cm.ConnectionString; OleDbConnectionStringBuilder oledbBuilder = new OleDbConnectionStringBuilder(connStr); // OLEDB连接字符串里的DataSource就是服务器名 serverName = oledbBuilder.DataSource; Dts.Variables["$Project::ServerName"].Value = serverName; Dts.TaskResult = (int)ScriptResults.Success; } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; } }
为什么你的原代码会出错?
你之前用的IDTSConnectionManagerDatabaseParameters100是SQL Server 2008的旧版接口,而且直接转换COM对象到.NET的连接对象很容易因为类型不匹配抛出错误。而解析连接字符串的方法更通用,也避开了COM对象转换的坑。
注意事项
- 确保连接管理器的名称和代码里的完全一致,大小写也要注意!
- 如果你的连接字符串是加密的,也不用担心,SSIS会自动解密后给你正确的字符串。
- 测试的时候可以加个
MessageBox.Show(serverName);来验证获取到的服务器名是否正确。
内容的提问来源于stack exchange,提问作者StackUser
相关产品推荐
相关产品推荐

