2016-04-05 2 views
0

Я хотел очистить мою функцию вставки sql и использовать подготовленные инструкции вместо взломанной строки в sqlite3_exec. Я продолжаю получать проблемы, пытаясь их использовать. Вот код:sqlite3_prepare_v2 возвращающая ошибка 1 код

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 

Когда я запускаю этот код, я получаю ошибку сегм 11 при попытке вставить что-то в представленной таблице. Я получаю ошибки, связанные с подготовкой return 1, а rc - кодом 21 (SQL_MISUSE). Мой вопрос в том, что не так с моим подготовленным заявлением?

+0

Чтобы получить сообщение об ошибке, позвоните по [sqlite3_errmsg()] (http://www.sqlite.org/c3ref/errcode.html). –

ответ

0

Вы получаете ошибку SQL_MISUSE, потому что пытались использовать подготовленный оператор, которого не было.

Не удалось подготовить, потому что вы пытались использовать параметр для имени таблицы. Параметры работают только для буквенных значений в выражениях, а не для имен таблиц и столбцов.

Смежные вопросы