首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的sqlite3_exec语法错误,但在sqlite3 CLI程序中运行良好

C语言中的sqlite3_exec语法错误,但在sqlite3 CLI程序中运行良好
EN

Stack Overflow用户
提问于 2017-02-24 10:00:28
回答 1查看 687关注 0票数 1

我正在尝试开发一个跨平台的C程序,它可以进行简单的SQLite数据库管理。它只需创建一些表、触发器,然后定期插入记录。

遇到的问题是,通过直接使用SQL命令调用sqlite3_exec,试图以编程方式创建触发器时出现语法错误。有趣的是,我的程序在Windows中运行得很好。它成功地创建/删除触发器。但是,在Linux (Ubuntu)上运行时,我得到了以下语法错误。

代码语言:javascript
复制
Info: connecting device...
Info: Opened database ./test.db successfully
Info: operation done successfully
Error: Time:Fri Feb 24 17:22:29 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: near ",": syntax error
Error: Time:Fri Feb 24 17:22:29 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @CREATE TRIGGER MODBUS_size_control INSERT ON MODBUS WHEN (select count(*) from MODBUS)>10
BEGIN
DELETE FROM MODBUS WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS ORDER BY DATETIME limit (select count(*) - 10 from MODBUS));
END;@

*请注意,添加@符号只是为了确保我没有在SQL命令中包含一些愚蠢的不可见值。@不是sqlite3_exec执行的SQL命令的一部分。

除此之外,其他插入操作工作得很好。

另一件奇怪的事情是,我运行了完全相同的SQL命令,这导致了sqlite3 shell程序中的错误。效果很好。

在sqlite3 shell中创建触发器之后。我再次运行我的程序,它给了我一个完全不同的错误。

代码语言:javascript
复制
Error: Time:Fri Feb 24 17:52:49 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: malformed database schema (MODBUS_size_control) - near ",": syntax error
Error: Time:Fri Feb 24 17:52:49 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @CREATE TRIGGER MODBUS_size_control INSERT ON MODBUS WHEN (select count(*) from MODBUS)>10
BEGIN
DELETE FROM MODBUS WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS ORDER BY DATETIME limit (select count(*) - 10 from MODBUS));
END;@
Error: Time:Fri Feb 24 17:52:51 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: malformed database schema (MODBUS_size_control) - near ",": syntax error
Error: Time:Fri Feb 24 17:52:51 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @INSERT INTO MODBUS(VALUE,ADDRESS,MAC,DATETIME) VALUES(09221,40002,'01:01:01:01:01:01','2017-02-24 17:52:51');INSERT INTO MODBUS(VALUE,ADDRESS,MAC,DATETIME) VALUES(29113,40001,'01:01:01:01:01:01','2017-02-24 17:52:51');@

如图所示,即使是以前工作的insert命令也不再工作了。似乎是扳机引起了所有的问题。但我就是不明白为什么。它在Windows上工作,在sqlite3 shell中运行Ubuntu。即使在创建触发器之后从sqlite3 shell插入记录,它也可以正常工作。请给我建议。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 11:15:53

问题记录在SQLite文档中。

触发器中对UPDATE、DELETE和INSERT语句的语法限制

触发器中的UPDATE、DELETE和INSERT语句不支持UPDATE、DELETE和INSERT语句的完整语法。适用下列限制:

  • 不支持UPDATE和DELETE语句上的ORDER和LIMIT子句。在任何上下文中,通常不支持ORDER和DELETE,但是可以使用SQLITE_ENABLE_UPDATE_DELETE_LIMIT编译时选项为顶级语句启用。但是,该编译时选项仅适用于顶级UPDATE和DELETE语句,而不适用于触发器中的UPDATE和DELETE语句。

在触发器的DELETE语句中使用限制条款:

代码语言:javascript
复制
DELETE FROM MODBUS 
    WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS 
    ORDER BY DATETIME
    limit (select count(*) - 10 from MODBUS));

然而,错误信息有些误导人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42435666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档