如何在 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
的引用以使用 SqlConnection
和 SqlCommand
对象。
重要提示:如果您使用 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 - 比较文本文件和非oledb连接以提供匹配和不匹配的输出