views:

378

answers:

3

App.Config file contents:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <appSettings>
     <add key="ConnectionString"
       value="Server=ADVDSQLMGA;User ID=ImporterApp;Password=!mp0rt3rApp;Database=id0405Moxy52"
       />


     <add key="DTS_PackageName"
      value="BlockImportNEW"/>
     <add key="DTS_PackagePathAndFileName"
      value="\\computername\foldername\folder1\folder2\folder3\filename.dts"/>
     <add key="DTS_PackageGUID"
      value="{C22A80D9-7613-43AF-939C-3C04AD7D848A}"/>
     <add key="DTS_ImportSourcePath"
      value="C:\foldername"/>
     <add key="DTS_ImportFileConnection"
       value="'filename.txt';'';'0'"/>
     <add key="DTS_ImportFileName"
       value="filename.txt"/>
     <add key="DTS_ImportWorkingPath"
       value="\\computername\foldername\folder1\folder2"/>
     <add key="DTS_ImportWorkingPathAndFileName"
       value="\\computername\foldername\folder1\folder2\filename.txt"/>
     <add key="DTS_DestinationServerName"
       value="computername"/>
     <add key="DTS_DestinationDatabase"
       value="databasename"/>
     <add key="DTS_DestinationTable"
       value="databasename.dbo.tablename"/>
     <add key="DTS_DestinationUserName"
       value="username"/>
     <add key="DTS_DestinationPassword"
       value="password"/>
    </appSettings>


</configuration>

Code:

            string DTS_PackageName = ConfigurationSettings.AppSettings["DTS_PackageName"];
            string DTS_PackagePathAndFileName = ConfigurationSettings.AppSettings["DTS_PackagePathAndFileName"];
            string DTS_PackageGUID = ConfigurationSettings.AppSettings["DTS_PackageGUID"];
            string DTS_ImportSourcePath = ConfigurationSettings.AppSettings["DTS_ImportSourcePath"];
            string DTS_ImportFileConnection = ConfigurationSettings.AppSettings["DTS_ImportFileConnection"];
            string DTS_ImportFileName = ConfigurationSettings.AppSettings["DTS_ImportFileName"];
            string DTS_ImportWorkingPath = ConfigurationSettings.AppSettings["DTS_ImportWorkingPath"];
            string DTS_ImportWorkingPathAndFileName = ConfigurationSettings.AppSettings["DTS_ImportWorkingPathAndFileName"];
            string DTS_DestinationServerName = ConfigurationSettings.AppSettings["DTS_DestinationServerName"];
            string DTS_DestinationDatabase = ConfigurationSettings.AppSettings["DTS_DestinationDatabase"];
            string DTS_DestinationTable = ConfigurationSettings.AppSettings["DTS_DestinationTable"];
            string DTS_DestinationUserName = ConfigurationSettings.AppSettings["DTS_DestinationUserName"];
            string DTS_DestinationPassword = ConfigurationSettings.AppSettings["DTS_DestinationPassword"];

            StringBuilder DTSArgs = new StringBuilder();

            DTSArgs.AppendFormat("/N \"{0}\" /G \"{1}\" /F \"{2}\" ",
                                        DTS_PackageName,
                                        DTS_PackageGUID,
                                        DTS_PackagePathAndFileName);            
            DTSArgs.AppendFormat(@"/A ""DestinationDatabase"":""8""=""{0}"" ", DTS_DestinationDatabase);
            DTSArgs.AppendFormat("/A \"DestinationPassword\":\"8\"=\"{0}\" ", DTS_DestinationPassword);
            DTSArgs.AppendFormat("/A \"DestinationServerName\":\"8\"=\"{0}\" ", DTS_DestinationServerName);
            DTSArgs.AppendFormat("/A \"DestinationTable\":\"8\"=\"{0}\" ", DTS_DestinationTable);
            DTSArgs.AppendFormat("/A \"DestinationUserName\":\"8\"=\"{0}\" ", DTS_DestinationUserName);
            DTSArgs.AppendFormat("/A \"ImportFileConnection\":\"8\"=\"{0}\" ", DTS_ImportFileConnection);
            DTSArgs.AppendFormat("/A \"ImportFileName\":\"8\"=\"{0}\" ", DTS_ImportFileName);
            DTSArgs.AppendFormat("/A \"ImportSourcePath\":\"8\"=\"{0}\" ", DTS_ImportSourcePath);
            DTSArgs.AppendFormat("/A \"ImportWorkingPath\":\"8\"=\"{0}\" ", DTS_ImportWorkingPath);
            DTSArgs.AppendFormat("/A \"ImportWorkingPathAndFileName\":\"8\"=\"{0}\" ", DTS_ImportWorkingPathAndFileName);
            DTSArgs.AppendFormat("/W \"0\"");

            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "dtsrun ";
//**** PROBLEM IS HERE:  The DTSArgs escpaes the double-quotes and backslashes in paths with backslashes,
//**** then the dtsrun.exe doesn’t like the arguments (see string below)
            proc.StartInfo.Arguments = DTSArgs.ToString();

            proc.Start();

            proc.WaitForExit();

What DTSARgs looks like:

/N "BlockImportNEW" /G "{C22A80D9-7613-43AF-939C-3C04AD7D848A}" /F "\computername\foldername\folder1\folder2\folder3\filename.dts" /A "DestinationDatabase":"8"="DBNAME" /A "DestinationPassword":"8"="password" /A "DestinationServerName":"8"="ServerName" /A "DestinationTable":"8"="dbname.dbo.tablename" /A "DestinationUserName":"8"="userName" /A "ImportFileConnection":"8"="file.txt';'';'0'" /A "ImportFileName":"8"="file.txt" /A "ImportSourcePath":"8"="C:\BlockImport" /A "ImportWorkingPath":"8"="\computername\foldername\folder1\folder2" /A "ImportWorkingPathAndFileName":"8"="\computername\foldername\folder1\folder2\file.txt" /W "0"

What proc.StartInfo.Arguments looks like:

/N \"BlockImportNEW\" /G \"{C22A80D9-7613-43AF-939C-3C04AD7D848A}\" /F \"\\computername\foldername\folder1\folder2\folder3\filename.dts\" /A \"DestinationDatabase\":\"8\"=\"DBNAME\" /A \"DestinationPassword\":\"8\"=\"password\" /A \"DestinationServerName\":\"8\"=\"ServerName\" /A \"DestinationTable\":\"8\"=\"dbname.dbo.tablename\" /A \"DestinationUserName\":\"8\"=\"userName\" /A \"ImportFileConnection\":\"8\"=\"file.txt';'';'0'\" /A \"ImportFileName\":\"8\"=\"file.txt\" /A \"ImportSourcePath\":\"8\"=\"C:\BlockImport\" /A \"ImportWorkingPath\":\"8\"=\"\\computername\foldername\folder1\folder2\" /A \"ImportWorkingPathAndFileName\":\"8\"=\"\\computername\foldername\folder1\folder2\file.txt\" /W \"0\"

When proc.Start is executed, it doesn't work correctly because of all the extra backslashes. It seems the DTSArgs stringbuilder string is in the correct format, but when converted via .ToString() and stored in proc.StartInfo.Arguments it gets all the backslashes.

How can I keep from sending proc.StartInfo.Arguments all those extra backslashes?

+4  A: 

I strongly suspect they aren't really in the string. Are you using the debugger by any chance? It shows an escaped form of the string.

Write the string to the console or something similar and you'll see the real value.

Jon Skeet
A: 

Are you using verbatim string literals?

Ie :

String c = @"C \B";
C. Ross
You mean *verbatim string literals*. Just "x y" is a string literal.
Jon Skeet
A: 

I did find that it was only showing with the escape characters in the debugger and immediate window. When written out to the Process, it was actually formatted corrected. I created a batch file that simply did this:

echo %1
pause

Then I called the batch file with the Process instead of the exe I was trying to run. That way I could see what was actually being sent. Part of my problem before was that the cmd window closed too fast.

Thanks for the help guys!

Adam