EzAPI OLEDB与SQL身份验证的连接

时间:2017-10-12 21:10:28

标签: c# ssis programmatically ezapi

我正在尝试使用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函数没有用户名和密码的参数。

谢谢,

2 个答案:

答案 0 :(得分: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部分,但由于这是连接管理器,这几乎就是一切
  • 我不认为您可以通过将Expressions添加到连接管理器本身来伪装它,因为当它在开发/创建对象期间尝试设置元数据时,表达式将不会处于活动状态
  • 放弃EzAPI - 我知道我有。我发现使用Biml更容易编程创建SSIS包。它得到了支持,而EzAPI似乎被抛弃了。

答案 1 :(得分:0)

Here是EzAPI中连接管理器的源代码。基于此,EzSqlOleDbCM(您正在使用的)扩展了EzOleDbConnectionManager,后者又扩展了EzConnectionManager

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

以下是我会尝试的选项:

选项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方法;使用Windows Auth进行硬编码的cos,这意味着您必须使用之前的选项再次覆盖它。

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;您可以找到here。您可以查看源代码并重新使用它或按原样使用代码。现在,EzAPI和Pegasus都是SSIS对象模型API的包装器。因此,您可以直接使用SSIS API;但直接使用它会很痛苦,因为你会写很多样板代码并重复你的代码。你最好在官方API上编写自己的包装器;或使用像EzAPI或Pegasus这样的东西。

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

如果您需要有关包装自动化的任何指导/意见,请与我们联系。