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()); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?