如何在SSIS脚本组件中使用OLEDB连接执行SqlCommand

AJA*_*ATI 4 sql-server ssis etl oledbconnection script-task

我正在使用 SSIS 2019,并且能够使用 ADO.Net 连接管理器执行 SQL 命令。我想在数据流任务内的脚本组件中使用 OLEDB 连接管理器,但收到以下错误:

System.InvalidCastException:无法将类型“System.__ComObject”的 COM 对象强制转换为类类型“System.Data.SqlClient.SqlConnection”。表示 COM 组件的类型实例不能转换为不表示 COM 组件的类型;但是,只要底层 COM 组件支持对接口 IID 的 QueryInterface 调用,它们就可以转换为接口。

在此输入图像描述 有人可以告诉我我们是否可以在数据流的 SSIS 脚本组件中使用 OLEDB 连接吗?

这是连接字符串的代码

  public override void PreExecute()
    {
        string conn = this.Connections.Connection.ConnectionString;
    }
Run Code Online (Sandbox Code Playgroud)

我在脚本 C# 代码中没有收到构建错误。但在脚本组件中出现错误。

Had*_*adi 7

使用脚本组件

要访问脚本组件中的连接管理器,您应该首先从脚本组件编辑器中指定此连接管理器,如下图所示:

在此输入图像描述

然后,在脚本组件中,您应该使用Connections变量来访问此连接管理器(在本例中,连接管理器分配的名称是Connection

var constr  = Connections.Connection.ConnectionString;
Run Code Online (Sandbox Code Playgroud)

截屏

在此输入图像描述

使用 C# 执行 SQL 命令

接下来,您应该使用此连接字符串来启动一个SqlConnection对象,以便 a 使用它,如下SqlCommand所示:

using(SqlConnection conn = new SqlConnection(constr))
{
    using (SqlCommand cmd = new SqlCommand("Write here your SQL command", conn))
    {
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

确保您添加了using System.Data.SqlClient使用SqlConnectionSqlCommand对象的引用。

重要提示:如果您使用 SQL 身份验证,则应将密码重新添加到连接字符串中,因为出于安全原因,不会从连接管理器中检索该密码。

使用脚本任务

您应该首先使用以下命令从连接管理器检索 OLE DB 连接字符串:

string constr = Dts.Connections["OledbCM"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)

示范

Messagebox.Show(constr)向脚本任务添加了命令,以显示检索到的连接字符串的外观:

在此输入图像描述


有用的网址:


更新 1:SqlConnection 与 OleDbConnection

由于您使用的SqlConnection类代表与 SQL Server 数据库的连接。尝试使用从 OleDb 连接检索的连接字符串时,您将遇到以下错误:

不支持关键字“Provider”

主要原因是 OleDB 连接要求连接字符串包含提供程序信息,因为它能够连接到不同的提供程序,例如 Oracle、Excel、Access、SQL。虽然SqlConnection类不支持此信息,因为它仅使用 SQL Server Native 客户端提供程序。

如何解决这个问题?

您可以简单地使用一个System.Data.OleDb.OleDbConnectionStringBuilder对象来删除这部分,使用以下代码:

string con = Dts.Connections["OledbCM"].ConnectionString;
var connBldr = new OleDbConnectionStringBuilder(con);
connBldr.Remove("Provider");
con  = connBldr.ConnectionString;
Run Code Online (Sandbox Code Playgroud)

或者你可以使用Linq:(记得添加System.Linq命名空间)

string con = Dts.Connections["OledbCM"].ConnectionString;
con = string.Join(";", con.Split(';').Where(c =>
    !c.TrimStart().StartsWith("Provider")));
Run Code Online (Sandbox Code Playgroud)

参考