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

Posted

技术标签:

【中文标题】如何在 SSIS 脚本组件中使用 OLEDB 连接执行 SqlCommand【英文标题】:How to execute SqlCommand using OLEDB connection in SSIS script component 【发布时间】:2022-01-20 15:36:29 【问题描述】:

我正在使用 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;
    

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

【问题讨论】:

既然您正在编写 .Net 脚本任务,为什么不直接使用 .Net SqlConnection? 感谢您的建议。我想使用 Package.config,因为它部署在多个环境中。 好的。无论哪种方式都可以。 您需要提供您在脚本中使用的 C# 代码 使用 c# 代码更新了描述。但在脚本组件中出现问题。 【参考方案1】:

使用脚本组件

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

然后,在脚本组件中,您应该使用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;

演示

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


有用的链接:

SSIS Script Task : ConnectionString for ADO.Net & OleDb ConnectionManager Check OLDEDB database Connection using script task in SSIS

更新 1:SqlConnection 与 OleDbConnection

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

关键字不支持“提供者”

主要原因是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;

或者你可以使用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

【讨论】:

我试图访问 DTS.Connections,这给了我一个错误,指出“类型或命名空间名称 'Connections' 不存在于命名空间 'Microsoft.SqlServer.Dts.Runtime'”中,即使添加了 Microsoft .SqlServer.Managed.DTS.dll。请让我知道脚本任务是在数据流还是控制流上。我遇到了问题,需要在 Dataflow 上使用脚本任务并能够访问 OLEDB 连接 您使用的是script task or a script component吗? 我正在使用脚本组件。我想在脚本组件中使用 OLEDB 连接。 @AMDI 检查我的答案更新 @AMDI 您需要将连接字符串转换为字符串变量,然后使用它创建一个新的 SQLConnection 对象,如我的回答中所述。

以上是关于如何在 SSIS 脚本组件中使用 OLEDB 连接执行 SqlCommand的主要内容,如果未能解决你的问题,请参考以下文章

SSIS如何从Paradox导入数据?

组件的 SSIS 包外部列不同步

SSIS - 比较文本文件和非oledb连接以提供匹配和不匹配的输出

SSIS - 旧版本OLEDB不支持Always On Availability Group

SSIS动态excel阅读

如何在数据流任务SSIS 2008 r2中传递变量