windows - sqlite3.exe : How to stop a long-running SQL statement

标签 windows sqlite

如何停止 Windows 上运行的 sqlite3.exe 中长时间运行的 SQL 语句?

文档位于http://www.sqlite.org/cli.html指出以下内容

You can terminate the sqlite3 program by typing your systems End-Of-File character (usually a Control-D). Use the interrupt character (usually a Control-C) to stop a long-running SQL statement.

但在 Windows 上,Control-D 不执行任何操作,Control-C 终止 sqlite3 程序。

我还尝试过 Break(即 Control-Pause),其作用与 Control-C 相同

有什么想法吗?

最佳答案

这似乎只是 Windows 上的错误。

查看 C source code as an amalgamation, version 3.8.8.3. 中的代码来自 SQLite download page ,我看到在 shell.c 中,如果定义了 SIGINT,则注册了一个 SIGINT 处理程序(对应于 Windows 上的 Control-C) :

#ifdef SIGINT
  signal(SIGINT, interrupt_handler);
#endif

SIGINTsignal.h 中定义,但在 Windows 上已被故意排除:

#if !defined(_WIN32) && !defined(WIN32)
# include <signal.h>
# if !defined(__RTP__) && !defined(_WRS_KERNEL)
#  include <pwd.h>
# endif
# include <unistd.h>
# include <sys/types.h>
#endif

包含 signal.h 会导致信号处理程序被注册,并且我确实按照预期使用 Control-C 获得了对长时间运行的 SQL 命令的中断(没有进程终止!)。

这对于后续的 Control-C 事件来说并不能可靠地工作(例如,如果您想中断 session 中第二个长时间运行的命令),并且 signal(SIGINT,...)documented as unsupported适用于 MSDN 上的 Win32 应用程序。

使用特定于 Windows 的 SetConsoleCtrlHandler而不是 signal(SIGINT,...) 来注册中断处理程序,可以可靠地处理后续的 Control-C 事件。

以下是使用 SetConsoleCtrlHandler 提到的 shell.c 源版本的差异:

757c757
< #ifdef SIGINT
---
> #if defined(SIGINT) || defined(_WIN32) || defined(WIN32)
766a767,782
> 
> #if defined(_WIN32) || defined(WIN32)
> /*
> ** Windows event handler
> */
> BOOL WINAPI CtrlHandler(DWORD dwType){ 
>   switch( dwType ){
>     case CTRL_C_EVENT: 
>       interrupt_handler(0);
>       return TRUE;
>  
>     default: 
>       return FALSE; 
>   } 
> }
> #endif
4207a4224,4225
> #elif defined(WIN32) || defined(_WIN32)
>   SetConsoleCtrlHandler(CtrlHandler, TRUE);

通过将该合并中的所有源文件添加到 Visual Studio C++ 控制台项目(除了构建所需的标准/系统 header 之外,没有外部依赖项),可以轻松构建 shell。

我已向 SQLite 用户邮件列表发送了一条消息,通知他们该错误。

关于windows - sqlite3.exe : How to stop a long-running SQL statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28562454/

相关文章:

windows - 使用 CMake 2.8.11.2 编译 osgQt (Windows7 MSVS11 Qt 5.1 OSG 3.2.0)

windows - 获取文件在磁盘/簇号上的偏移量

java - SQLite查询后光标返回无结果(通过单元测试但在运行时失败)--android

c# - 如何: Nested Lists in SQLite-Net Extensions

mysql - sql多列按最新过滤重复项

c++ - 使用 setupapi 备份驱动程序

c - 如何递归列出目录

windows - WiX,如何防止文件卸载,虽然我们忘记设置永久 ="yes"

Qt 5 与 SQLite : bindValue() results in "Parameter count mismatch" error

java - 为包含sqlite的java项目制作.exe文件