开发者

Unwanted escape characters in string

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.

H开发者_如何学Goow can I keep from sending proc.StartInfo.Arguments all those extra backslashes?


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.


Are you using verbatim string literals?

Ie :

String c = @"C \B";


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!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜