Winapi 带SQLite visual c的Windows.h++;错误

Winapi 带SQLite visual c的Windows.h++;错误,winapi,visual-c++,sqlite,Winapi,Visual C++,Sqlite,我两天前刚开始windows应用程序编程。。我正在使用VC++,它有一些我无法解决的问题。 当我向下面的函数发送正确的参数时,它会正确地显示所有内容,但不会将insert查询保存到DB 声明如下: INSERT INTO BOOKS(ID,USERNAME,ISSUER,RETURNED) VALUES(1,'xyz','xyz',0); 下面是sqlite的表创建语句: sql = "CREATE TABLE IF NOT EXISTS BOOKS(" \ "ID INT PRI

我两天前刚开始windows应用程序编程。。我正在使用VC++,它有一些我无法解决的问题。 当我向下面的函数发送正确的参数时,它会正确地显示所有内容,但不会将insert查询保存到DB

声明如下:

INSERT INTO BOOKS(ID,USERNAME,ISSUER,RETURNED) VALUES(1,'xyz','xyz',0);
下面是sqlite的表创建语句:

sql = "CREATE TABLE IF NOT EXISTS BOOKS("  \
     "ID INT PRIMARY KEY    NOT NULL," \
     "BOOKNAME           TEXT    NOT NULL," \
     "ISSUER            TEXT     NOT NULL," \
     "RETURNED        INT);";
以下是函数:

using namespace std;
int WriteToDB(sqlite3 *,const char [],wchar_t *,HWND *);

int WriteToDB(sqlite3 *_db,const char _query[],wchar_t *ermsg,HWND *hw)
{
    sqlite3_stmt *insertStmt;
    MessageBox(*hw,L"Creating insert statement",L"INFO",MB_OK);

    if(sqlite3_prepare(_db, _query, 400,&insertStmt, NULL))
    MessageBox(*hw,L"Prepared!",L"Info",MB_OK);

    MessageBox(*hw,L"Stepping into insert statement",L"INFO",MB_OK);
    MessageBox(*hw,(LPWSTR)_query,L"Input",MB_OK);

    if (sqlite3_step(insertStmt) != SQLITE_DONE)
    {
        wcscpy(ermsg,CharToWChar("Didn't Insert Item! Please check statement or DataBase!!"));
        return 0;
    }
    sqlite3_finalize(insertStmt);
    return 1;
}

编辑:这是我得到的新错误:

在SQLite中

near "I": Syntax Error
本声明:

INSERT INTO BOOKS(ID,BOOKNAME,ISSUER,RETURNED) VALUES(1,'xyz','xyz',0);
这里的错误是:

if(sqlite3_prepare(_db, _query, 400,&insertStmt, NULL)) //...
应该是:

if(sqlite3_prepare(_db, _query, 400,&insertStmt, NULL)==SQLITE_OK) //...
因为
#define SQLITE_OK 0/*Successful result*/
,所以您之前的条件与假装的条件相反

建议:不要在SQL语句中合并数据,请考虑使用参数和接口。

编辑:

建议使用
sqlite3\u prepare\u v2
而不是
sqlite3\u prepare
。使用这种方法,您可以很容易地通过
sqlite3\u errmsg
获得有关错误原因的信息:

if(sqlite3_prepare(_db, _query, 400,&insertStmt, NULL) == SQLITE_OK) {
    MessageBox(*hw,L"Prepared!",L"Info",MB_OK);
} else {
    MessageBox(*hw, sqlite3_errmsg16(_db), L"Error", MB_OK);
}

没有错误只是不保存。。。这是没有插入项弹出。发布
sql
定义和
WriteToDB
调用。确定。。。这就是问题所在。。。我按照你说的做了,当我运行它时,“准备好的”并没有显示在屏幕上。。。我猜那里有点不对劲。。。需要帮助……嗯,你能给我详细解释一下吗?我太迷茫了:/这会迫使你重新设计你的函数,但使用
插入到书中(ID、用户名、发行人、返回的)值(?,,?)更安全和在
sqlite3\u步骤之前
使用
sqlite3\u bind\u int(insertStmt,1,1);sqlite3_bind_text(insertStmt,2,“xyz”,-1,SQLITE_STATIC)但我需要这样的陈述:/OK,这只是一个建议!继续寻找真正的问题!