【问题标题】:C# sqlite how to print affected rows from executed sqlite command line .readC#sqlite如何从执行的sqlite命令行打印受影响的行.read
【发布时间】:2021-10-06 01:08:37
【问题描述】:

我有一个名为 query.sql 的文件,其中包含一个事务,我想使用我的 C# 代码中的 sqlite 命令行执行该文件。它工作正常,但我无法从命令行输出中获取受影响的行。我想获取受影响的行并使用 MessageBox 显示它。

我使用 Process 的 C# 代码:

ProcessStartInfo startinfo = new ProcessStartInfo("sqlite3.exe");
startinfo.Arguments = string.Format("\"{0}\" \".read '{1}'\"",DatabasePath, Path.Combine(Path.GetTempPath(), "query.sql"));
//startinfo.WindowStyle = ProcessWindowStyle.Normal;
Process.Start(startinfo);

从命令行查看:

sqlite3.exe "C:\Users\me\AppData\Local\app\database.db" ".read 'C:\Users\me\AppData\Local\Temp\query.sql'"

我执行了命令并且数据库发生了变化,但我无法捕获受影响的行。如何从该进程中捕获受影响的行?

【问题讨论】:

  • 为什么使用命令行而不是Sqlite .NET library
  • 是的,这对于 SQLite.NET 来说是一个非常好的用例。
  • INSERT 命令不返回行。
  • @Magnetron 我尝试将库用于导入案例,但性能如此不同。使用库,我需要使用流阅读器读取 sql 文件以将其分配给字符串,如果文件非常大,当我在诊断工具中看到时,处理和使用大内存需要很长时间。但我毫不怀疑我是否以错误的方式这样做。

标签: c# sqlite


【解决方案1】:

首先,您需要在 SQL 末尾添加 Select Changes();

https://www.sqlite.org/lang_corefunc.html#changes

然后您需要设置流程以将输出重定向到您的应用。

startinfo.UseShellExecute = false;
startinfo.RedirectStandardOutput = true;
var proc = Process.Start(startinfo);
while (!proc.StandardOutput.EndOfStream)
{
    string output = proc.StandardOutput.ReadLine();
    Console.WriteLine(output);
}

https://stackoverflow.com/a/4291965/7182460

虽然上述方法应该可行,但还有一种更简单的方法。 我不确定您使用命令行的原因是什么。您可能想看看使用 ORM。

https://github.com/praeclarum/sqlite-net

【讨论】:

  • 我尝试将库用于导入案例,但性能如此不同。使用库,我需要使用流阅读器读取 sql 文件以将其分配给字符串,如果文件非常大,当我在诊断工具中看到时,处理和使用大内存需要很长时间。但我毫不怀疑我是否以错误的方式这样做。
  • 感谢您的代码运行良好。但我更改了SELECT changes();,因为它总是返回1,我更改为SELECT total_changes(); 并附加到我的sql 文件的末尾。我会看看你提供的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多