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