sqlite3_prepare_v2返回错误1代码

时间:2016-04-05 17:19:19

标签: c++ sqlite

我想清理我的sql插入函数并在sqlite3_exec中使用预处理语句而不是被黑客攻击的字符串。我一直在尝试使用它。这是代码:

void Database::insert(char* tableName,int time1,int x,int y,int z)
{

int i;
i = sqlite3_prepare_v2(db, "insert into ?1 values(?2, ?3, ?4, ?5);", -1, &stmt, NULL);

sqlite3_bind_text(stmt, 1, tableName, -1, SQLITE_STATIC);

std::cout <<i<< std::endl;
sqlite3_bind_int(stmt, 2, time1);

std::cout <<"made it int1"<< std::endl;
sqlite3_bind_int(stmt, 3, x);

std::cout <<"made it int2"<< std::endl;
sqlite3_bind_int(stmt, 4, y);

std::cout <<"made it int3"<< std::endl;
sqlite3_bind_int(stmt, 5, z);



 rc = sqlite3_step(stmt);
 if (rc != SQLITE_OK) {
     std::cout << "SQL error: "<< errMsg << std::endl;
 } else {
   std::cout << "insert successfully" << std::endl;
 }
 std::cout << "boom2"<< std::endl;
 sqlite3_finalize(stmt);
 }

database.h文件:

#ifndef DATABASE_H
#define DATABASE_H


#include <sqlite3.h>
#include <iostream>
#include <stdio.h>

class Database
{


public:

  Database(char* name);
  ~Database();
  int openConnection(char* name);
  void insert(char* table, int vTime, int x, int y, int z);
  void closeConnection();
  void createTable(char* dbName);
  void getData(char* table, int time1);

private:
  sqlite3* db;
  sqlite3_stmt *stmt;
  char *errMsg;
  int rc;
  char* dbName;
  std::string sqlStatement;
  const char* sql;
};


static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
   int i;
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

#endif // DATABASE_H

当我运行此代码时,在尝试将某些内容插入到提供的表中时,我得到了一个seg错误11。我得到的错误与准备返回1和rc是代码21(SQL_MISUSE)有关。我的问题是我准备好的陈述有什么问题?

1 个答案:

答案 0 :(得分:0)

您收到SQL_MISUSE错误,因为您尝试使用不存在的预准备语句。

准备失败,因为您尝试使用参数作为表名。参数仅适用于表达式中的文字值,而不适用于表/列名称。