关于SQLite 转帖
最近在项目中用到了SQLite。主要是客户端用到,这种小型内嵌数据库还是蛮实用的。 提起SQLite我不自觉的就想起了微软出的ACCESS。他们两个确实是有可比性的。曾经,小型网站数据库,ASP可以用到ACCESS。但是,PHP却是没有相对应的解决方案,自从SQLite的出现,给PHP提供了一个解决方案。 在客户端里面,我用到的数据保存方案有:CSV、INI、XML。其中XML是最强大的,但是可惜的是我用的解析器是Tinyxml,实用tinyxml的初衷就是简单,只用于配置,所以再复杂的事情就有些应付不过来。至少,逻辑上要复杂上许多。 我最近,看了迅雷,搜狗……一些软件的目录,都有一个sqlite3.dll。于是就去了解了下。貌似现在很多的im软件用这个做客户端数据库的也多起来了。看起来这个项目还是不错的。 SQLite有好几种版本,如果要想内嵌到应用程序当中去,那就要用sqlite-amalgamation这个版本了。它就是一个头文件,一个c的实现文件,这个文件里面有十多万行代码。我用VS2003编译的时候,编译器会提醒我,行数有些超长了-_-!! C++里面对SQLite的包装类库里面,我觉得SOCI算是很不错的,这个项目不仅仅是对SQLite进行了包装,而且对其他数据库都有包装,像MySQL、PostgreSQL、Oracle这些数据库都支持,还支持ODBC。如果感兴趣可以看我转载的一篇博文:http://www.cppblog.com/tx7do/archive/2009/11/27/102054.html “工欲善其事,必先利其器。” 我在用SQLite Expert创建数据库的时候,发现有一个选择编码的选项,但是很可惜的是全部都是UTF系的编码……我习惯性的选择了UTF8,这个也是它的默认选项。我创建了一个测试的数据库,随便弄了个表,打了几个字,然后保存。再用VS2003做了一个测试程序,结果读进来的是乱码。后来我把数据库文件放到一个路径里面有中文的路径下,结果它找不到文件,看来它完完全全的使用了UTF字符,包括对路径的处理。看起来,只能转码了。以下附上两个Windows下的转码的方法: std:: string UTF8ToAnsi( const std:: string & strIn,std:: string & strOut){ WCHAR*strSrc=NULL; TCHAR*szRes=NULL; inti=MultiByteToWideChar(CP_UTF8,0,strIn.c_str(),-1,NULL,0); strSrc=newWCHAR[i+1]; MultiByteToWideChar(CP_UTF8,strSrc,i); i=WideCharToMultiByte(CP_ACP,NULL); szRes=newTCHAR[i+1]; WideCharToMultiByte(CP_ACP,szRes,i,NULL); strOut=szRes; delete[]strSrc; delete[]szRes; returnstrOut; } { WCHAR*strSrc=NULL; TCHAR*szRes=NULL; intlen=MultiByteToWideChar(CP_ACP,(LPCTSTR)strIn.c_str(),0); unsignedshort*wszUtf8=newunsignedshort[len+1]; memset(wszUtf8,len*2+2); MultiByteToWideChar(CP_ACP,(LPWSTR)wszUtf8,len); len=WideCharToMultiByte(CP_UTF8,(LPCWSTR)wszUtf8,NULL); char*szUtf8=newchar[len+1]; memset(szUtf8,len+1); WideCharToMultiByte(CP_UTF8,szUtf8,len,NULL); strOut=szUtf8; delete[]szUtf8; delete[]wszUtf8; returnstrOut; }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |