Как запустить встроенную команду sqlite3 с помощью c#?

#c# #sqlite #command-line #process

Вопрос:

Когда я выполняю приведенную ниже команду в командной строке Windows:

 sqlite3 -header -csv local-DataBase.sqlite "select * from customers;" > data.csv
 

Он создает файл под названием «data.csv» с результатом "select * from customers;" в нем с заголовками.
Мне нужно выполнить ту же команду, что и выше, в c#, чтобы консольное приложение создало файл для результата команды sql.

До сих пор я делал это:

  string sqlLite3ExePath = "sqlite3";
 string sqLitePath2 = "-header -csv local-DataBase.sqlite "select* from customers;" > data.csv";

 using (Process pProcess = new Process())
                {
                    pProcess.StartInfo.FileName = sqlLite3ExePath;
                    pProcess.StartInfo.Arguments = sqLitePath2 ;
                    pProcess.StartInfo.UseShellExecute = false;
                    pProcess.StartInfo.RedirectStandardOutput = true;
                    pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
                    pProcess.StartInfo.CreateNoWindow = false;
                    pProcess.EnableRaisingEvents = true;
                    pProcess.Exited  = PProcess_Exited;
                    pProcess.Start();
                    string output = pProcess.StandardOutput.ReadToEnd(); 
                    pProcess.WaitForExit();    
                    Debug.WriteLine(output);
                }
       
 

Но это приводит к ошибке:

 Error: near ">": syntax error
 

Что я делаю не так?

Комментарии:

1. > data.csv это операция оболочки, перенаправляющая вывод в файл, а не аргумент sqlite. output Строка уже содержит этот вывод. Попробуйте > data.csv полностью удалить и сохранить содержимое output в файл

2. @PanagiotisKanavos да, но если я хочу сохранить вывод, используя ту же встроенную команду внутри переменной «sqLitePath2», как мне это сделать?

3. Это две команды, а не одна. Если вы хотите это сделать, вам нужно запустить оболочку (т. Е. cmd ) и передать всю строку в качестве аргумента. Если вы это сделаете, это pProcess.StandardOutput.ReadToEnd(); ничего не вернет

4. @PanagiotisKanavos все в порядке. Так что для этого процесса. Начинаем. Имя файла станет cmd? и вся команда в качестве аргумента?

5. @PanagiotisKanavos, пожалуйста, дайте точное решение

Ответ №1:

Как упоминалось в комментариях, при выполнении этой команды из командной строки происходит две вещи: вы запускаете SQLite, но из-за оператора перенаправления оболочка также захватывает выходные данные и создает файл для вас.

Если вы хотите воссоздать именно такое поведение, вам нужно запустить оболочку и передать ей эту команду:

     string sqlLite3ExePath = "cmd";
    string sqLitePath2 = "/c "sqlite3 -header -csv local-DataBase.sqlite ^"select* from customers;^" > data.csv"";

    using (var pProcess = new Process())
    {
        pProcess.StartInfo.FileName = sqlLite3ExePath;
        pProcess.StartInfo.Arguments = sqLitePath2;
        pProcess.StartInfo.UseShellExecute = false;
        pProcess.StartInfo.RedirectStandardOutput = true;
        pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
        pProcess.StartInfo.CreateNoWindow = false;
        pProcess.EnableRaisingEvents = true;
        pProcess.Exited  = PProcess_Exited;
        pProcess.Start();
        string output = pProcess.StandardOutput.ReadToEnd();
        pProcess.WaitForExit();
        Console.WriteLine(output);
    }