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());
}
复制代码

 

posted @   菜鸟要飞~  Views(1384)  Comments(0Edit  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示