Search code examples
c#packageconnection-stringsqlconnection

Passing ConnectionString from SqlConnectionSringBuilder to ConnectionManager


I want to get a ConnectionString from an instance of SqlConnectionStringBuilder as a String.

This seems simple, and should be as easy as this:

String conString = builder.ConnectionString;

However the String that SqlConnectionStringBuilder gives up doesn't include the Password field/value. I'm guessing this is some sort of security feature, is there a way to force Password to be included in the String?


Looking at this further I'm thinking this may have something to do with ConnectionManager. What I am trying to do is modify the ConnectionString for a Package, changing the Initial Catalog.

Below is my code, the point that builder's connection string is passed back into connectionManager's the Password is lost...

    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());
    }

Solution

  • I need to rename this a little maybe, as the question is different now, but here is my solution:

    The first part of this question was answered correctly by @madd0. The ConnectionString does contain the Password field.


    The second part was solved with formatting code is below:

    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());
    }
    

    I played about with the ConnectionStrings and noticed after a while that the original String had spaces between each property.

    Running 2 tests I found that without spaces the Password was lost...

    connectionManager.ConnectionString = destCon;
    

    Test 1: No Spaces:

    When destCon = Data Source=xxx.xxx.xxx.xxx;Initial Catalog=StagingArea;User ID=*****;Password=*****;Provider=SQLNCLI;Auto Translate=false;

    Then connectionManager.ConnectionString = Data Source=xxx.xxx.xxx.xxx;User ID=*****;Initial Catalog=StagingArea;Provider=SQLNCLI;Auto Translate=false;

    Test 2: Spaces:

    When destCon = Data Source=xxx.xxx.xxx.xxx; Initial Catalog=StagingArea; User ID=*****; Password=*****; Provider=SQLNCLI; Auto Translate=false;

    Then connectionManager.ConnectionString = Data Source=xxx.xxx.xxx.xxx; Initial Catalog=StagingArea; User ID=*****; Password=*****; Provider=SQLNCLI; Auto Translate=false;

    No idea why this happens, but without spaces the ordering is adjusted and the Password field is lost.