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

How to execute SqlCommand using OLEDB connection in SSIS script component

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

System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to class type 'System.Data.SqlClient.SqlConnection'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.

有人可以让我知道我们是否可以在数据流的 SSIS 脚本组件中使用 OLEDB 连接。

这是连接字符串的代码

  public override void PreExecute()
    {
        string conn = this.Connections.Connection.ConnectionString;
    }

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

使用脚本组件

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

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

var constr  = Connections.Connection.ConnectionString;

截图

正在使用 C# 执行 SQL 命令

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

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

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

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

使用脚本任务

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

string constr = Dts.Connections["OledbCM"].ConnectionString;

示范[​​=67=]

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


有用的链接:


更新 1:SqlConnection 与 OleDbConnection

因为您使用的是 SqlConnection class,它表示与 SQL 服务器数据库的连接。尝试使用从 OleDb 连接检索的连接字符串时,您将遇到以下错误:

Keyword not supported "Provider"

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

如何解决这个问题?

您可以使用以下代码简单地使用 System.Data.OleDb.OleDbConnectionStringBuilder 对象删除此部分:

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

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

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

参考资料

  • How do I remove "Provider=..." from a connection string