2016-04-05 82 views
0

sqlの挿入関数をクリーンアップし、sqlite3_execの中にハッキングされた文字列の代わりにprepared statementを使用したいと考えました。私はそれを使用しようとする問題を続けています。ここでは、コードされています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を取得します。私は1を返す準備に関連するエラーを取得し、rcはコード21(SQL_MISUSE)を取得します。私の質問は私の準備した声明に間違っていますか?

+0

エラーメッセージを表示するには、[sqlite3_errmsg()](http://www.sqlite.org/c3ref/errcode.html)を呼び出します。 –

答えて

0

存在しないプリペアドステートメントを使用しようとしたため、SQL_MISUSEエラーが発生します。

テーブル名にパラメータを使用しようとしたため、準備が失敗しました。パラメータは、式のリテラル値に対してのみ機能し、テーブル/カラム名に対しては機能しません。

関連する問題