2016-04-05 11 views
0

Ich wollte meine SQL-Einfügefunktion bereinigen und vorbereitete Anweisungen anstelle einer gehackten Zeichenfolge in sqlite3_exec verwenden. Ich bekomme Probleme, wenn ich versuche, es zu benutzen. Hier ist der Code:sqlite3_prepare_v2 Rückgabe Fehler 1 Code

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 Datei:

#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 

Wenn ich diesen Code ausführen, erhalte ich eine seg Fehler 11, wenn sie versuchen, etwas in die vorgesehene Tabelle einzufügen. Ich bekomme Fehler im Zusammenhang mit der Vorbereitung der Rückgabe von 1 und RC Code 21 (SQL_MISUSE). Meine Frage ist, was stimmt nicht mit meiner vorbereiteten Aussage?

+0

Um eine Fehlermeldung zu erhalten, rufen Sie [sqlite3_errmsg()] (http://www.sqlite.org/c3ref/errcode.html) auf. –

Antwort

0

Sie erhalten den SQL_MISUSE-Fehler, weil Sie versucht haben, eine vorbereitete Anweisung zu verwenden, die nicht vorhanden war.

Die Vorbereitung ist fehlgeschlagen, weil Sie versucht haben, einen Parameter für einen Tabellennamen zu verwenden. Parameter funktionieren nur für Literalwerte in Ausdrücken, nicht für Tabellen-/Spaltennamen.

Verwandte Themen