sqlite3 回调使用 unicode
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
wchar_t ASCII[64]={0};
for(i=0; i<argc; i++){
CCharEncodeUtility::UTF8ToUnicode(argv[i] ? argv[i] : "NULL",ASCII);
CString str;
//str.Format((char*)("%s = %s\n"), azColName[i],ASCII );
TRACE(L"%s\t",ASCII);
}
TRACE(L"\n");
return 0;
}
int CFCIAnalysisView::QueryDB(CRecordListMap& map)
{
int result = 0;
COleDateTime dtEndTime(m_ctrlEndTime.GetDate());
COleDateTime dtBeginTime( m_ctrlBeginTime.GetDate() );
int testType = m_testType;
int unit = m_ctrlUnit.GetCurSel()+1;
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("C:\\sqlite\\FCI.db", &db);
if( rc ){
TRACE(_T("Can't open database: %s\n"), sqlite3_errmsg(db));
exit(0);
}else{
TRACE(_T("Opened database successfully\n"));
}
dtBeginTime.Format(L"%Y-%m-%d %H:%M:%S");
CString str;
str = L"SELECT * from RecordsMap where ( TestTime >= ";
str = str+ "'"+dtBeginTime.Format(L"%Y-%m-%d %H:%M:%S")+"'"
+ " and TestTime <= " + "'" + dtEndTime.Format(L"%Y-%m-%d %H:%M:%S") + "'" + ")" ;
TRACE(L"%s\n",str);
char sql[512];
CCharEncodeUtility::UnicodeToUTF8(str.GetBuffer(str.GetLength()),sql);
TRACE(L"%s\n",str);
const char* data = "Callback function called";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
str.ReleaseBuffer();
if( rc != SQLITE_OK ){
TRACE( _T("SQL error: %s\n"), zErrMsg);
sqlite3_free(zErrMsg);
}else{
TRACE(_T("Operation done successfully\n"));
}
sqlite3_close(db);
return result;
}
字符转换工具
#include <string>
using namespace std;
#if !defined(AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_)
#define AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CCharEncodeUtility
{
public:
CCharEncodeUtility(){};
virtual ~CCharEncodeUtility(){};
public:
//在使用SQLite的过程中(c++),如果创建一个表,
//如果SQL语句中包含中文字符,就会报错;如果是从数据库表中查询数据,
//如果数据库表中的某些字段为中文,查询结果也不能正常显示,出现这种
//情况的原因是因为SQLite的编码与工程的编码不一致造成的。
//Sqlite的编码默认为UTF-8编码,而vc++工程中所编写的SQL语句,
//可能是Unciode或者ASCII码,特别是ASCII码,如果不进行转换,
//写入数据库以及从数据库中读出的数,都会是乱码(只针对中文字符),
//因此,本文主要写一下各种编码下的编码转换:
static void ASCIIToUTF8(char cACSII[] , char cUTF8[] )
{
//先将ASCII码转换为Unicode编码
int nlen= MultiByteToWideChar(CP_ACP,0,cACSII,-1,NULL,NULL);
//wchar_t *pUnicode = new wchar_t[SQL_MAX_LENTH];
wchar_t *pUnicode = new wchar_t[512];
memset(pUnicode,0,nlen*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,cACSII,-1,(LPWSTR)pUnicode,nlen);
wstring wsUnicode = pUnicode ;
//将Unicode编码转换为UTF-8编码
nlen = WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,cUTF8,nlen,NULL,NULL);
}
//将UTF-8编码转换为ASCII编码
static void UTF8ToASCII(char *cUTF8 , char ASCII[])
{
string str = cUTF8 ;
//先将UTF8编码转换为Unicode编码
int nLen = MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,NULL,0);
wchar_t *pwcUnicode = new wchar_t[nLen] ;
memset(pwcUnicode,0,nLen*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,(LPWSTR)pwcUnicode,nLen);
//将Unicode编码转换为ASCII编码
nLen = WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,ASCII,nLen,NULL,NULL);
}
//将ASCII编码转换为Unicode编码
static void ASCIIToUnicode(char cASCII[],wchar_t wcUnicode[])
{
int nlen= MultiByteToWideChar(CP_ACP,0,cASCII,-1,NULL,NULL);
MultiByteToWideChar(CP_ACP,0,cASCII,-1,(LPWSTR)wcUnicode,nlen);
}
//将Unicode编码转换为UTF-8编码
static void UnicodeToUTF8(wchar_t wcUnicode[] , char cUTF8[] )
{
wstring wsUnicode = wcUnicode ;
int nLen = WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,cUTF8,nLen,NULL,NULL);
}
//将UTF-8编码转换为Unicode编码
static void UTF8ToUnicode(char *cUTF8 , wchar_t wcUnicode[])
{
string sUTF8 = cUTF8 ;
int nLen = MultiByteToWideChar(CP_UTF8,0,sUTF8.c_str(),-1,NULL,0);
MultiByteToWideChar(CP_UTF8,0,sUTF8.c_str(),-1,(LPWSTR)wcUnicode,nLen);
}
};
#endif // !defined(AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_)