sqlite3.exe:如何停止长时间运行的SQL语句

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

http://www.sqlite.org/cli.html上的文档声明如下

您可以通过键入您的系统文件结束符(通常是Control-D)来终止sqlite3程序。 使用中断字符(通常是Control-C)来停止长时间运行的SQL语句。

但在Windows上,Control-D什么也不做,Control-C终止sqlite3程序。

我也试过Break(即Control-Pause),它和Control-C一样

有任何想法吗?

它似乎只是在Windows上的错误。

将C源代码中的代码视为合并版本3.8.8.3。 从SQLite 下载页面 ,我发现在shell.c ,如果定义了SIGINT ,就会有一个SIGINT处理程序(对应于Windows上的Control-C)注册:

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

SIGINT是在signal.hsignal.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命令中断(没有进程终止!)。

尽管(例如,如果要中断会话中的第二个长时间运行的命令),并且signal(SIGINT,...)被记录为不支持 MSDN上的Win32应用程序,但这对于后续的Control-C事件并不可靠。

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

以下是使用SetConsoleCtrlHandler提到的源代码版本SetConsoleCtrlHandler

 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 ++控制台项目(除了需要构建的标准/系统头之外没有外部依赖项),可以轻松地构建shell。

我发送了一条消息给SQLite用户邮件列表来通知他们错误。