Sqlite   发布时间:2022-05-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了MFC操作SQlite,打开数据库路径存在中文,解决方案大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

MFC操作打开sqlite数据库,其中szDBfile为数据库所在的位置。最开始使用的相对路径,即szDBfile永远等于“HData.zip”。但是尤其设备需要,需要把.exe文件放入开机启动的sHell中。这样使用相对路径就会产生错误,即需要给szDBfile赋值绝对路径。此时,如果全路径包括汉字,那样sqlite3_open_v2(szDBfile,&m_sq3DB,@R_59_5607@OPEN_READWRITE,NulL)不会成功。代码如下:


if (@R_59_5607@OK != sqlite3_open_v2(szDBfile,NulL))

{ //创建新的数据库

sqlite3_open_v2(szDBfile,@R_59_5607@OPEN_READWRITE | @R_59_5607@OPEN_CREATE,null);

sqlite3_exec(m_sq3DB,sql_NEWDB,NulL,null);

}

原因分析:sqlite只支持UTF-8编码,所以无法识别包含汉字的多字符集。因此,需要将全路径名称由多字符集转换为Unicode字符集,再由Unicode字符集转换为UTF-8编码格式。转换函数如下:

//有多字符集转换为Unicode

WCHAR *CDB::mbcsToUnicode(const char *zfileName)

{

int nByte;

WCHAR *zMbcsfilename;

int codepage = ArefileAPIsANSI() ? CP_ACP : CP_OEMCP;

nByte = MultiBytetoWIDeChar(codepage,zfilename,-1,0)*sizeof(WCHAR);

zMbcsfilename = (WCHAR *)malloc(nByte*sizeof(zMbcsfilename[0]));

if( zMbcsfilename==0 )

{

return 0;

}

nByte = MultiBytetoWIDeChar(codepage,zMbcsfilename,nBytE);

if(nByte == 0)

{

free(zMbcsfileName);

zMbcsfilename = 0;

}

return zMbcsfilename;

}

//有Unicode转为UTF-8

char *CDB::unicodetoUtf8(const WCHAR *zWideFilename)

{

int nByte; char *zfilename;

nByte = WIDeCharToMultiByte(CP_UTF8,zWideFilename,0);

zfilename = (char *)malloc(nBytE);

if(zfilename == 0)

{

return 0;

}

nByte = WIDeCharToMultiByte(CP_UTF8,nByte,0);

if( nByte == 0 )

{

free(zfileName);

zfilename = 0;

}

return zfilename;

}

最后使用代码:

char * pPath;

WCHAR *wcPath;

wcPath = @H_440_1@mbcsToUnicode(strFullPath);//strFulPath即为带有中文的全路径字符串

pPath = unicodetoUtf8(wcPath);

szDBfile = pPath;

if (@R_59_5607@OK != sqlite3_open_v2(szDBfile,NulL))

{ / /创建新的数据库

sqlite3_open_v2(szDBfile,null);

sqlite3_exec(m_sq3DB,null);

}

大佬总结

以上是大佬教程为你收集整理的MFC操作SQlite,打开数据库路径存在中文,解决方案全部内容,希望文章能够帮你解决MFC操作SQlite,打开数据库路径存在中文,解决方案所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: