这是我的第一个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 *,但没有任何效果。 请帮助,谢谢。
答案 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);