WINAPI SQLite C无法正确地将数据插入数据库

WINAPI SQLite C unable to insert data to DB properly

本文关键字:数据 插入 数据库 正确地 SQLite WINAPI      更新时间:2023-10-16

程序编译和运行正常,但在写入DB时出现问题我不知道为什么这是代码:

sqlite3_stmt *insertStmt;
char *_sql = "INSERT INTO BOOKS(ID,BOOKNAME,ISSUER,RETURNED) VALUES(@id,@bname,@iss,@ret);";
if(sqlite3_prepare(_db, _sql, 300, &insertStmt, NULL) == SQLITE_OK)
    MessageBox(*hw,L"Prepared!",L"Info",MB_OK);
else
    MessageBox(*hw,(LPWSTR)CharToWChar(sqlite3_errmsg(_db)),L"INFO",MB_OK);
int paramidx1 = sqlite3_bind_parameter_index(insertStmt, "@idx");
int paramidx2 = sqlite3_bind_parameter_index(insertStmt, "@bname");
int paramidx3 = sqlite3_bind_parameter_index(insertStmt, "@iss");
int paramidx4 = sqlite3_bind_parameter_index(insertStmt, "@return");
sqlite3_bind_text(insertStmt, paramidx1, arg1, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insertStmt, paramidx2, arg2, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insertStmt, paramidx3, arg3, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insertStmt, paramidx4, arg4, -1, SQLITE_TRANSIENT);
MessageBox(*hw,L"Stepping into insert statement",L"INFO",MB_OK);
if (sqlite3_step(insertStmt) == SQLITE_OK)
{
    wcscpy(ermsg,CharToWChar("Error in inserting statement or in DB."));
    MessageBox(*hw,(LPWSTR)CharToWChar(sqlite3_errmsg(_db)),L"INFO",MB_OK);
    return 0;
}

例如,当我输入12作为id,输入"XYZ"作为bname,输入"ABC"作为iss,输入34作为return。。在数据库中它是:

1    X    A    3

每个在各自的列处。需要帮助。

从代码的剩余部分来看,您似乎正在保存UNICODE字符串。我看不出arg1, 2, 3, 4的类型,但你可能想尝试更换

sqlite3_bind_text(/* ... */);

带有

sqlite3_bind_text16(/* ... */);

您可能还需要检查all是否与数据库中的默认编码兼容。正如文件中所说:

如果调用sqlite3_open()或sqlite3_open_v2(),则数据库的默认编码将为UTF-8;如果使用sqlite3_open16(),将按本机字节顺序使用UTF-16。

你也可以使用一些PRAGMA语句:

PRAGMA编码
PRAGMA编码="UTF-8"
PRAGMA编码="UTF-16"
PRAGMA编码="UTF-16le"
PRAGMA编码="UTF-16be"

在第一种形式中,如果主数据库已经创建,那么此杂注返回主数据库使用的文本编码"UTF-8"、"UTF-16le"(小端UTF-16编码)或"UTF-16be"(big-endian UTF-16编码)。如果主数据库尚未则返回的值是将用于创建主数据库(如果它是由该会话创建的)。

此杂注的第二到第五种形式设置了如果主数据库是由一场字符串"UTF-16"被解释为"使用本机字节排序"。无法更改文本数据库创建后的编码以及任何尝试因此将被默默地忽略。

一旦为数据库设置了编码,就无法对其进行更改。