You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:37:18