SQLite Unicode与Visual C ++ 2015

时间:2018-01-26 23:09:10

标签: sqlite utf-8

这是我的第一个SQLite + VC 2015程序,我的项目是UTF-8。 我有SQLite表,我想保存中文。 例如,我有表:

城市{   Id TEXT PRIMARY KEY,   说明文字}

然后,我有一个带文本字段的对话框,用户在那里输入城市名称,并且CString变量m_szName链接到它。

并且,我有一个片段代码将城市插入表格:

stringstream sql;
sql << "INSERT OR REPLACE INTO Cities "
    << " (Id,Desc) VALUES ('1001','" << m_szName.GetBuffer() << "')";

现在的问题是,m_szName.GetBuffer()返回TCHAR *,因此上面的程序有语法错误。 如果我使用&#34; wstringstream sql&#34;,上面的代码很好,但是sqlite3_exec不接受它,因为它只接受(char *)。

我试图将TCHAR *转换为char *,但没有任何效果。 请帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

sqlite3_exec()是少数没有UTF-16版本的功能之一,因此您必须正确convert the string contents into UTF-8

CStringA str_utf8 = CW2A(m_szName.GetBuffer(), CP_UTF8);

但是,当名称包含引号时,您的代码会爆炸。使用参数会更好一点,也可以直接使用UTF-16字符串:

const char *sql = "INSERT ... VALUES ('1001', ?)";
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
    cerr << sqlite3_errmsg(db);
    return;
}
sqlite3_bind_text16(stmt, 1, m_szName.GetBuffer(), -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
    cerr << sqlite3_errmsg(db);
sqlite3_finalize(stmt);