1

我正在尝试使用 EzAPI 2012 创建一个 SSIS 包。我找到的模板和教程工作正常,但我无法找到任何关于使用 SQL 身份验证(用户名和密码)创建与 OLEDB 的连接。这是我用来创建 OLEDB 连接的部分代码:

// Creating a connection to the database:
EzSqlOleDbCM srcConn = Activator.CreateInstance(typeof(EzSqlOleDbCM), new object[] { package }) as EzSqlOleDbCM;           
srcConn.SetConnectionString(_CL_SourceServerName, _CL_SourceDBName);
srcConn.Name = "SourceDB";

EzSqlOleDbCM destConn = Activator.CreateInstance(typeof(EzSqlOleDbCM), new object[] { package }) as EzSqlOleDbCM;
destConn.SetConnectionString(_CL_DestServerName, _CL_DestDBName);
destConn.Name = "DestDB";

以“ CL ”开头的名字是变量。EzSqlOleDbCM 函数没有用户名和密码参数。

谢谢,

4

2 回答 2

0

是 EzAPI 中连接管理器的源代码。基于此,EzSqlOleDbCM(这是您正在使用的)扩展 EzOleDbConnectionManager 进而扩展 EzConnectionManager

您在 EzSqlOleDbCm 上使用 SetConnectionString 方法;不幸的是,它被硬编码为仅使用 Windows Auth。

所以这里是我会尝试的选项:

选项1:

EzConnectionManager 公开了一个名为 ConnectionString 的属性并有一个 setter;因此您可以使用此属性直接分配连接字符串(使用您的用户名和密码)(并避免调用 SetConnectionString 方法)。例如:

srcConn.ConnectionString = @"Provider=my_oledb_provider;Data Source=myServerAddress;Initial Catalog=myDataBase; User Id=myUsername;Password=myPassword";

选项 2:

此外,EzOleDbConnectionManager 公开了 UserName 和 Password 属性;因此您也可以使用这些属性来指定您的用户名和密码。但是,如果您这样做,则不能使用 SetConnectionString 方法;cos 被硬编码为使用 Windows Auth,这意味着您必须使用上一个选项再次覆盖它。

srcConn.UserName = "my_user_name";
srcConn.Password = "my_password";

选项 3:

如果您在项目中直接使用 EzAPI 源代码,我将添加另一种称为 SetConnectionString 的便捷方法,但它接受用户名和密码。

public void SetSqlAuthConnectionString(string server, string db, string user, string pwd)
    {
        // Notice that we are just setting the ConnectionString property.
        ConnectionString =string.Format("Provider=my_oledb_provider;Data Source={0};Initial Catalog={1};User Id={2};Password={3}", server, db, user, pwd
    };

然后你可以使用如下:

srcConn.SetSqlAuthConnectionString(myServer, myDB, userName, password);

或者,在更高的层次上:我也会给 Biml 一个机会。如果这能很好地满足您的需求。另外,我写了一个类似于 EzApi 的库,叫做Pegasus;你可以在这里找到。您可以查看源代码并重新使用它或按原样使用代码。现在 EzAPI 和 Pegasus 都是 SSIS 对象模型 API 的包装器。因此,您可以直接使用 SSIS API;但是直接使用它会很痛苦,因为您将编写大量样板代码并重复您的代码。您最好针对官方 API 编写自己的包装器;或使用 EzAPI 或 Pegasus 之类的东西。

如果 SSIS 是您的日常工作,并且您根据某些模式创建了很多包,那么我建议您一定要研究包自动化。开发和测试时间的节省是巨大的,巨大的,巨大的。如果您不愿意使用 3rd 方库(如 EzApi 或 Pegasus),我建议您查看这些库的源代码并自行开发;或比姆尔。

如果您需要有关包自动化的任何指导/意见,请告诉我。

于 2017-10-14T00:53:36.103 回答
0

EzApi 非常适合它解决的问题。这是许多不足的情况之一。您可以在源代码中看到他们已硬编码连接管理器以使用 SSPI

/// <summary>
/// OleDb connection manager for SQL Server
/// </summary>
public class EzSqlOleDbCM : EzOleDbConnectionManager
{
    public EzSqlOleDbCM(EzPackage parent) : base(parent) { }
    public EzSqlOleDbCM(EzPackage parent, ConnectionManager c) : base(parent, c) { }
    public EzSqlOleDbCM(EzPackage parent, string name) : base(parent, name) { }
    public EzSqlOleDbCM(EzProject parentProject, string streamName) : base(parentProject, streamName) { }
    public EzSqlOleDbCM(EzProject parentProject, string streamName, string name) : base(parentProject, streamName, name) { }

    public void SetConnectionString(string server, string db)
    {
        ConnectionString = string.Format("provider=sqlncli11;integrated security=sspi;database={0};server={1};OLE DB Services=-2;Auto Translate=False;Connect Timeout=300;",
            db, server);
    }
}

可以做什么?

  • 修改源代码以适应用户 ID 和密码
  • 在 EzApi 中尽可能多地使用,然后恢复使用基本 SSIS 对象模型 - 请参阅LoadFromXML部分,但由于这是连接管理器,这几乎就是一切
  • 我认为您不能通过将表达式添加到连接管理器本身来伪造自己的方式,因为当它尝试在开发/对象创建期间设置元数据时,表达式还不会处于活动状态
  • 放弃EzAPI - 我知道我有。我发现使用Biml以编程方式创建 SSIS 包要容易得多。并且它受到支持,而 EzAPI 似乎已被放弃。
于 2017-10-13T15:20:13.777 回答