在C#中使用相同的ProcessStartInfo实例执行多个命令(使用BCP)

时间:2012-02-15 09:26:45

标签: c# sql sql-server process

我知道我的标题似乎与StackOverflow中的其他人一样,但我的意图是另一个。

我创建了一个C#函数,它使用BCP命令为我的数据库中的每个表创建BCP文件。以下代码是一个示例,是函数的一部分。

List<string> tables = GetTables(); // a function which takes all tables from my database

string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -Ppassword";

ProcessStartInfo processInfo = null;
     try {
        foreach ( string table in tables ) {
           command = string.Format( command, table );
           processInfo = new ProcessStartInfo( "cmd", "/c " + command );
           processInfo.RedirectStandardOutput = true;
           processInfo.CreateNoWindow = false;
           Process process = new Process();
           process.StartInfo = processInfo;
           process.Start();
           string result = process.StandardOutput.ReadToEnd();
           Console.WriteLine( result );
        }
     } catch ( Exception e ) {
        Console.WriteLine( e.Message );
     }

我想避免执行多个窗口,我想在同一窗口中执行每个命令行。

我的代码是好还是替代?

由于

2 个答案:

答案 0 :(得分:2)

我不确定是否有办法打开一个命令窗口,然后继续发布命令,如果有人聪明地这样做会很好。

您可以使用Streamwriter编写包含所需命令的批处理文件,然后运行批处理文件。这至少只会打开一个过程。

StreamWriter sw = new StreamWriter("MyBatchFile.bat");
            string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -%1";
            ProcessStartInfo processInfo = null;
            try
            {
                foreach (string table in tables)
                {
                    command = string.Format(command, table);
                    sw.WriteLine(command);                                        
                }
                sw.Flush();
                sw.Close();
                processInfo = new ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword");
                processInfo.RedirectStandardOutput = true;
                processInfo.CreateNoWindow = false;
                Process process = new Process();
                process.StartInfo = processInfo;
                process.Start();
                string result = process.StandardOutput.ReadToEnd();
                Console.WriteLine(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

批处理文件在命令行中包含“%1”,因此当您启动该过程时,将数据库的密码传递给批处理文件

ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword");

这应该确保如果有人找到了批处理文件,那么密码将只有%1。

不确定这是否比你已经更好......但它只打开一个命令窗口:)

马丁

答案 1 :(得分:0)

一个非常简单的选择是使用&&运算符构建一个庞大的命令。这是一个说明这个想法的片段:cmd /c echo hello && echo world。这里的缺点是,如果你的任何任务失败,找出哪一个有点困难。

您始终可以将命令写入本地* .bat文件,然后处理该文件。然后,如果一个失败,您可以更好地了解它失败的位置,并且您希望将cmd参数从/c切换到/k,这样您就可以保持窗口打开以查看发生了什么。