Я использую System.Diagnostics.Process для запуска специальной команды sqlite, но выполняется только половина команд - PullRequest
0 голосов
/ 01 ноября 2019
string connectionString = @"Data Source=C:\sqlite\test.db; Version=3; FailIfMissing=True; Foreign Keys=True;";

SQLiteConnection conn = new SQLiteConnection(connectionString);          
conn.Open();

string batFilePath = @"D:\mockforbat.bat";

if (!File.Exists(batFilePath))
{
    using (FileStream fs = File.Create(batFilePath))
    {
        fs.Close();
    }
}

using (StreamWriter sw = new StreamWriter(batFilePath))
{
    sw.WriteLine(@"C:");
    sw.WriteLine(@"cd\");
    sw.WriteLine(@"cd sqlite");
    sw.WriteLine(@"sqlite3 test.db");
    sw.WriteLine(@".mode csv");
    sw.WriteLine(@".import D:/Ashif/SQLITE/Bulk.csv excelUpload"); 
}

Process process = Process.Start(batFilePath);
process.WaitForExit();  

Когда я выполню эту команду, она будет выполняться только до строки "sqlite3 test.db", а другие команды не будут выполнены.

Вывод, который я получаю после выполнения кода:

Output after executing the code

1 Ответ

0 голосов
/ 01 ноября 2019

Вы не задали вопрос явно, поэтому я предполагаю, что вопрос «как я могу вызвать командную строку sqlite из моей программы с соответствующими аргументами?»

Интерфейс командной строки sqlite3 является интерактивнымпо умолчанию, но вы, вероятно, не хотите, чтобы это использовалось как часть сценария / автоматического выполнения.

manual показывает аргумент -init file, который должен быть более подходящим для того, что выхочу достичь.

Попробуйте добавить свои метакоманды (.mode csv, .import x ...) в отдельный myFile, и выполните sqlite3 -init myFile, и это должно работать.


Помимо этого основного вопроса, я вижу потенциальные проблемы с вашим кодом:

Вы открываете соединение с базой данных с помощью new SQLiteConnection(connectionString);, но вы никогда не используете это соединение. Вместо этого вы снова подключаетесь к своей базе данных, выполняя sqlite3 test.db в своем файле bat.

Если вы используете Process.Start(), вам не нужен файл bat, вы можете напрямую вызвать sqlite3 с помощьюнеобходимые аргументы. (Хотя вам, вероятно, понадобится полный путь sqlite3, чтобы это работало)

Подводя итог, вы можете использовать что-то подобное (не проверено, адаптироваться по мере необходимости):

            var sqliteScriptPath = @"D:\myScript.txt";
            var scriptContent = @"
.mode csv
.open test.db
.import D:/Ashif/SQLITE/Bulk.csv excelUpload";

            File.WriteAllText(sqliteScriptPath, scriptContent);

            Environment.CurrentDirectory = @"C:\sqlite"; // If you use relative paths somewhere in your command you will need something like that
            // You can also create a ProcessStartInfo instance, and set its WorkingDirectory property before giving it to Process.Start()

            Process process = Process.Start("sqlite3", $"-init {sqliteScriptPath}");
            process.WaitForExit();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...