用C程序访问sqlite

用C程序访问sqlite,c,sqlite,C,Sqlite,运行此程序时转储内核: int main(void) { sqlite3 *conn; int error = 0; error = sqlite3_open("cloud_db.sqlite3", &conn); if (error) { puts("Can not open database"); exit(0); } error = sqlite3_exec(conn, "updat

运行此程序时转储内核:

int main(void) {
   sqlite3 *conn;
   int     error = 0;

  error = sqlite3_open("cloud_db.sqlite3", &conn);
  if (error) {
          puts("Can not open database");
          exit(0);
  }

  error = sqlite3_exec(conn,
          "update server set servername=\'Laks\' where ipaddress=\'192.168.1.111\'",
        0, 0, 0);
  if (error) {
          puts("Can not update table");
          exit(0);
  }
  sqlite3_close(conn);

  return 0;
}
我尝试过使用C访问select查询sqlite,它显示了内容——这很好。如何使用诸如update之类的查询?在上面,我尝试执行如下查询:

update server set servername="Laks" where ipaddress="192.168.1.111";

在sqlite>中使用运行此查询效果良好。如何从C程序执行update查询?

当sharptooth询问哪条语句导致内核转储时,他是正确的。既然你还没有回答,我想你可能不知道怎么回答

首先,确保您的程序是用调试符号编译的。假设您使用的是gcc,那么可以通过在命令行上使用-g来实现

接下来,确保您的环境将写入核心文件。在sh、bash等中运行时,使用shell命令ulimit-c unlimited执行此操作;在csh中运行时,使用limit-core unlimited执行此操作

运行程序,让它崩溃

接下来,使用gdb PROGRAMENAME corename在gdb中显示核心


最后,在gdb中运行backtrace命令以查看崩溃的位置。

当sharptooth询问哪条语句导致核心转储时,它是正确的。既然你还没有回答,我想你可能不知道怎么回答

首先,确保您的程序是用调试符号编译的。假设您使用的是gcc,那么可以通过在命令行上使用-g来实现

接下来,确保您的环境将写入核心文件。在sh、bash等中运行时,使用shell命令ulimit-c unlimited执行此操作;在csh中运行时,使用limit-core unlimited执行此操作

运行程序,让它崩溃

接下来,使用gdb PROGRAMENAME corename在gdb中显示核心


最后,在gdb中运行backtrace命令以查看崩溃的位置。

因为您指出当语句包含servername=\'Laks\'时问题就在那里,而当您将其更改为servername=Laks时问题就离开了,我想是反斜杠导致了问题。您不需要反斜杠来转义字符串文字中的撇号。只需使用servername='Laks'。可以在字符串文字中转义引号,在字符文字中转义撇号,但反之亦然


您还需要添加分号;在查询字符串的末尾:任意sql语句文本

既然您指出,当语句包含servername=\'Laks\'时问题就出现了,当您将其更改为servername=Laks时,问题就离开了,我想是反斜杠造成的。您不需要反斜杠来转义字符串文字中的撇号。只需使用servername='Laks'。可以在字符串文字中转义引号,在字符文字中转义撇号,但反之亦然


您还需要添加分号;在查询字符串的末尾:任意sql语句文本

问题可能存在于任何地方——可能存在于某些周围的代码中。哪条语句导致核心转储?我可以说问题与以下部分有关:servername=\'Laks\'如何在updateserver set servername=something中更新字符串值?使用下面的部分给出了错误-但没有核心转储错误=sqlite3\u execconn,更新服务器\u池集servername=Laks,其中ipaddress=192.168.1.111,0,0;问题可能存在于任何地方——可能存在于某些周围的代码中。哪条语句导致核心转储?我可以说问题与以下部分有关:servername=\'Laks\'如何在updateserver set servername=something中更新字符串值?使用下面的部分给出了错误-但没有核心转储错误=sqlite3\u execconn,更新服务器\u池集servername=Laks,其中ipaddress=192.168.1.111,0,0;我遵循了这些步骤,但它的核心转储文件不在当前目录中???任何像/tmp这样的位置我都需要检查核心文件吗?我遵循了这些步骤,但它的核心转储文件不在当前目录中???任何像/tmp这样的位置我都需要检查核心文件吗?是的,一旦问题解决,现在移除\后工作正常。error=sqlite3\u execconn,更新服务器\u池集servername='Laks',其中ipaddress='192.168.1.111',0,0,0;表更新为Laks.:但它仍然说核心转储..哪里可以找到核心转储文件?在现有目录中找不到。您需要在查询末尾使用分号。即使添加了分号,也会导致核心转储!!事实上,我有一个使用select查询的代码部分..这会导致核心转储--无论如何,更新工作正常…谢谢大家是的,一旦问题解决了,现在它在删除\后工作正常。error=sqlite3\u execconn,更新服务器\u池集servername='Laks',其中ipaddress='192.168.1.111',0,0,0;表更新为Laks.:但它仍然说核心转储..哪里可以找到核心转储文件?在现有目录中找不到。您需要在查询末尾使用分号。即使添加了分号,也会导致核心转储!!实际上我有一个代码部分,它使用 选择查询..这将导致核心转储--无论如何,更新工作正常…谢谢大家