Sqlite 中文路径无法识别
直接使用sqlite3_open 函数打开指定路径下数据库文件时,当遇到路径中含有中文字符的情况下,需将文件路径的编码进行转化,具体操作如下:
int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
int nlen=MultiByteToWideChar(codepage, 0, inDbName, -1, NULL, 0); WCHAR wBuf[256]; MultiByteToWideChar(CP_ACP, 0, inDbName, -1, wBuf, nlen); CHAR pBuf[256]; nlen=WideCharToMultiByte(CP_UTF8 , 0, wBuf, -1, 0, 0, 0, 0); WideCharToMultiByte(CP_UTF8 , 0, wBuf, -1, pBuf, nlen,0, 0); //打开数据库
m_nState = sqlite3_open(pBuf, &m_p1Db);
例程在GetSqlDataToCsv工程中应用。
数据库操作
创建,插入
CppSQLite3DB m_db; CppSQLite3Query m_query; CString pd = L"Wdsa0.d"; USES_CONVERSION; char* password = T2A(pd); try { m_db.open(_T("D:\\IVDatas4.db")); sqlite3_key(m_db.mpDB,password,strlen(password)); if(!m_db.tableExists(_T("data"))) { m_db.execDML(_T("CREATE TABLE data(PATH nvarchar(100),") _T("I nvarchar(5000),") _T("V nvarchar(5000)") _T(");")); } m_db.execDML(_T("BEGIN")); CString strsql; strsql = _T("INSERT INTO data VALUES('") +filePth+_T("','") +x_i+_T("','") +y_v+_T("');"); m_db.execDML(strsql); m_db.execDML(_T("COMMIT")); m_db.close(); } catch(CppSQLite3Exception ex) { m_query.finalize(); m_db.close(); AfxMessageBox(L"存储失败"); } AfxMessageBox(L"存储成功");
查询
void Selectdb() { CString strsql; CppSQLite3DB m_db; CString pd = L"Wdad0.d"; USES_CONVERSION; char* password = T2A(pd); m_db.open(_T("D:\\IVDatas4.db")); sqlite3_key(m_db.mpDB,password,strlen(password)); CppSQLite3Query q = m_db.execQuery(L"select * from data"); while (!q.eof()) { CString dbnum; dbnum = q.fieldValue(0); AfxMessageBox(dbnum); dbnum = q.fieldValue(1); dbnum = q.fieldValue(2); q.nextRow(); } q.finalize(); m_db.close(); }
try { int len = WideCharToMultiByte(CP_ACP, 0, strDBname, -1, NULL, 0, NULL, NULL); char* ptxtTemp = new char[len + 1]; WideCharToMultiByte(CP_ACP, 0, strDBname, -1, ptxtTemp, len, NULL, NULL); if (sqlite3_open(ptxtTemp, &m_db)) { sqlite3_close(m_db); exit(1); delete [] ptxtTemp; return ; } CString pd = L"Wu00.d"; USES_CONVERSION; char* password = T2A(pd); sqlite3_key(m_db.mpDB,password,strlen(password)); delete [] ptxtTemp; char **dbResult; //是 char ** 类型,两个*号 char * errmsg = NULL; int nRow, nColumn; int result = sqlite3_get_table(m_db, "select * from data",&dbResult, &nRow, &nColumn, &errmsg); if (NULL != errmsg) { sqlite3_free_table(dbResult); errmsg = NULL; return ; } if (nRow < 2 || nColumn < 1) return ; for (int i = 1; i < nRow; i++) { CString outputstr; //outputstr = dbResult[i * nColumn]; wstring w_str = Utf82Unicode(dbResult[i * nColumn]); std::string m_saveDislay_str; //保存显示 m_saveDislay_str = WString2String(w_str); outputstr = m_saveDislay_str.c_str(); AfxMessageBox(outputstr); outputstr = dbResult[i * nColumn+1]; outputstr = dbResult[i * nColumn+2]; } sqlite3_close(m_db); } catch (CppSQLite3Exception ex) { AfxMessageBox(ex.errorMessage()); }

浙公网安备 33010602011771号