[英]I am using System.Diagnostics.Process to run the sqlite special command but only half of the commands get executed
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:
您没有明确提出问题,所以我认为问题是“我如何使用相关的 arguments 从我的程序中调用 sqlite 命令行?”
sqlite3 命令行界面默认是交互式的,但在将它用作脚本/自动执行的一部分时,您可能不希望这样做。
该手册显示了一个-init file
参数,该参数应该更适合您想要实现的目标。
尝试在单独的myFile
中添加您的元命令( .mode csv
, .import x
...),然后执行sqlite3 -init myFile
它应该可以工作。
除了这个主要问题,我发现您的代码存在潜在问题:
您正在使用new SQLiteConnection(connectionString);
但你从来没有使用过这个连接。 相反,您通过执行 bat 文件中的sqlite3 test.db
再次连接到数据库。
如果你使用Process.Start()
你不需要一个 bat 文件,你可以直接用所需的 arguments 调用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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.