Передача ConnectionString из SqlConnectionSringBuilder в ConnectionManager - PullRequest
1 голос
/ 24 ноября 2011

Я хочу получить ConnectionString из экземпляра SqlConnectionStringBuilder как String.

Это кажется простым и должно быть так же просто, как это:

String conString = builder.ConnectionString;

Однако String, от которого SqlConnectionStringBuilder отказывается, не включает поле / значение Password. Я предполагаю, что это какая-то функция безопасности, есть ли способ заставить Password быть включенным в String?


Глядя на это дальше, я думаю, что это может иметь какое-то отношение к ConnectionManager. Я пытаюсь изменить ConnectionString для Package, изменив Initial Catalog.

Ниже мой код, точка, в которой строка соединения builder передается обратно в connectionManager, пароль теряется ...

    public void DataTransfer(String sourceConnection, String destConnection, String pkgLocation)
    {     
        Package pkg;
        Application app;
        DTSExecResult pkgResults;

        try
        {
            app = new Application();
            pkg = app.LoadPackage(pkgLocation, null);

            foreach (ConnectionManager connectionManager in pkg.Connections)
            {
                SqlConnectionStringBuilder builder;
                switch (connectionManager.Name)
                {
                    case "SourceConnection":
                        builder = new SqlConnectionStringBuilder(sourceConnection) { PersistSecurityInfo = true };
                        builder.Remove("Initial Catalog");
                        builder.Add("Initial Catalog", "StagingArea");
                        connectionManager.ConnectionString = builder.ConnectionString.ToString();
                        connectionManager.ConnectionString += ";Provider=SQLNCLI;Auto Translate=false;";
                        Debug.WriteLine(connectionManager.ConnectionString.ToString());
                        break;
                    case "DestinationConnection":
                        builder = new SqlConnectionStringBuilder(sourceConnection) { PersistSecurityInfo = true };
                        builder.Remove("Initial Catalog");
                        builder.Add("Initial Catalog", "StagingArea");
                        connectionManager.ConnectionString = builder.ConnectionString.ToString();
                        connectionManager.ConnectionString += ";Provider=SQLNCLI;Auto Translate=false;";
                        Debug.WriteLine(connectionManager.ConnectionString.ToString());
                        break;
                }
            }
            pkgResults = pkg.Execute();
        }
        catch (Exception e)
        {

            throw;
        }
        Console.WriteLine(pkgResults.ToString());
    }

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Установите PersistSecurityInfo в True перед установкой других свойств в SqlConnectionStringBuilder: D

0 голосов
/ 25 ноября 2011

Мне нужно немного переименовать это, может быть, вопрос теперь другой, но вот мое решение:

На первую часть этого вопроса правильно ответил @ madd0.ConnectionString содержит поле Password.


Вторая часть была решена с помощью кода форматирования ниже:

public void DataTransfer(String sourceConnection, String destConnection, String pkgLocation)
{     
    Package pkg;
    Application app;
    DTSExecResult pkgResults;

    try
    {
        app = new Application();
        pkg = app.LoadPackage(pkgLocation, null);

        foreach (ConnectionManager connectionManager in pkg.Connections)
        {
            SqlConnectionStringBuilder builder;
            switch (connectionManager.Name)
            {
                case "SourceConnection":
                    builder = new SqlConnectionStringBuilder(sourceConnection) { PersistSecurityInfo = true };
                    builder.Remove("Initial Catalog");
                    builder.Add("Initial Catalog", "StagingArea");
                    var sourceCon = builder.ConnectionString + ";Provider=SQLNCLI;Auto Translate=false;";
                    //Added spaces to retain password!!!
                    sourceCon = sourceCon.Replace(";", "; ");
                    connectionManager.ConnectionString = sourceCon;
                    Debug.WriteLine(connectionManager.ConnectionString.ToString());
                    break;
                case "DestinationConnection":
                    builder = new SqlConnectionStringBuilder(sourceConnection) { PersistSecurityInfo = true };
                    builder.Remove("Initial Catalog");
                    builder.Add("Initial Catalog", "StagingArea");
                    var destCon = builder.ConnectionString + ";Provider=SQLNCLI;Auto Translate=false;";
                    //Added spaces to retain password!!!
                    destCon = destCon.Replace(";", "; ");
                    connectionManager.ConnectionString = destCon;
                    Debug.WriteLine(connectionManager.ConnectionString.ToString());
                    break;
            }
        }
        pkgResults = pkg.Execute();
    }
    catch (Exception e)
    {

        throw;
    }
    Console.WriteLine(pkgResults.ToString());
}

Я играл с ConnectionString sи через некоторое время заметил, что в исходном String были пробелы между каждым свойством.

Выполнив 2 теста, я обнаружил, что без пробелов Password был потерян ...

connectionManager.ConnectionString = destCon;

Тест 1: без пробелов:

Когда destCon = Data Source=xxx.xxx.xxx.xxx;Initial Catalog=StagingArea;User ID=*****;Password=*****;Provider=SQLNCLI;Auto Translate=false;

Затем connectionManager.ConnectionString = Data Source=xxx.xxx.xxx.xxx;User ID=*****;Initial Catalog=StagingArea;Provider=SQLNCLI;Auto Translate=false;

Тест 2: Пробелы:

Когда destCon = Data Source=xxx.xxx.xxx.xxx; Initial Catalog=StagingArea; User ID=*****; Password=*****; Provider=SQLNCLI; Auto Translate=false;

Затем connectionManager.ConnectionString = Data Source=xxx.xxx.xxx.xxx; Initial Catalog=StagingArea; User ID=*****; Password=*****; Provider=SQLNCLI; Auto Translate=false;

Не знаю, почему это происходит, но без пробеловпорядок скорректирован и поле Password потеряно.

...