Я использую команду .import из sqlite для импорта файла в базу данных. Я создаю Process
и выполняю оболочку командной строки sqlite.
Этот процесс выводит строку каждые x
вставки, но проблема в том, что событие для OutputDataReceived
запускается только в конце получение всех данных сразу. Я хочу добиться, чтобы событие запускалось для каждой строки, записанной в StandardOutput
, а не один раз в конце жизненного цикла процесса.
Когда я выполняю команду .\sqlite3.exe .\db.db ".mode csv" ".progress 9" ".separator ," ".import '.\file.csv' table"
в cmd, вывод записывается построчно.
Я просмотрел все сообщения stackoverflow с той же проблемой, но не могу найти решения. Большое спасибо!
У меня есть следующий код внутри функции async
:
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = GetSQLitePath(),
Arguments = $"{databasePath} \".mode csv\" \".separator ','\" \".progress {opcodes}\" \".import '{filePath}' '{tableName}'\"",
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
}
};
process.EnableRaisingEvents = true;
process.ErrorDataReceived += (sender, args) =>
{
if (args.Data != null)
{
result.ErrorMessage = args.Data; //result is the instance of a class that gets returned
result.Success = false;
if (!process.HasExited)
process.Kill();
}
};
process.OutputDataReceived += (sender, args) =>
{
Console.WriteLine(args.Data);
progress.Report(args.Data);
};
await WaitForWriteAccess(databasePath); //checks if the db is locked and if so, it waits
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
if (!process.HasExited)
await Task.Run(() => process.WaitForExit());
return result;