设为首页 收藏本站
查看: 892|回复: 0

[经验分享] VC2005 + SQLite 3.6.3 编译、测试开发手记

[复制链接]

尚未签到

发表于 2016-11-30 10:29:58 | 显示全部楼层 |阅读模式
偶然的机会对SQLite有了兴趣,花了半天的时间小小研究了一下,包括VC2005环境下SQLite的编译,开发测试等。
初次接触,只是测试了基本的数据库操作功能,更多的高级功能有待以后继续深入研究,废话少说,言归正传。
现在SQLite的最新版本是 V3.6.3,发布于2008年9月22,详见http://sqlite.org/的介绍。
还是补充一句什么是SQLite吧,“SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。”
简单的说,SQLite的特点就是小巧、高效,SQLite数据库只有一个文件,也可以说是文件数据库吧,对于某些桌面应用以及嵌入式应用来说,SQLite可以提供相当高效的数据存储方案。如果你正在位自己的应用程序寻找一种数据管理方案的话,不妨考虑一下SQLite。
接着说SQLite如何在VC环境下进行开发。
从SQLite官网上当下来的,可以有SQLite命令行程序,还可以有运行支持的DLL,当然开源的SQLite还提供了完整的源码。
嵌入SQLite开发的程序发布时,需要提供SQLiteDll就行了,但是对于开发者来说,最方便的还是用Lib辅助开发,因此我们自己来编译SQLite就很有必要了(当然,也可以通过DLL直接获取Lib,但自己编译出来的感觉不一样,哈哈:))。
好了,首先从http://sqlite.org/download.html上把最新的源码下载下来,注意,Source Code有好几个版本,没搞太清楚各个版本都是干啥的,这里我们下载下来sqlite-source-3_6_3.zipZip格式的,不是gz的,呵呵),当然把sqlite-amalgamation-3.6.3.tar.gz下载下来也是最好的,因为我们后面可能需要其中的一个文件(sqlite3.def),不想下的话,从别的地方找一下就Ok了。
有了源码以后,我们先建立一个Win32的空白DLL项目,比如这里项目为SQLiteLib,然后把刚才下载的SQLite源码解压到一个文件夹(如sqlite-source),把这个文件夹复制到项目文件夹里,并加入到新建的工程中。
这样就完成了第一步,但是这个时侯如果你编译的话,会发现有好几个错误和N个警告。首先在项目解决方案里移除以下几个文件tclsqlite.cshell.crtree.cfts3.cfts3_hash.cfts3_icu.cfts3_porter.cfts3_tokenizer1.cfts3_tokenizer.c
其中tclsqlite.c用于生成基于TCLAPI,如果要编译,这需要另外下载tcl.hshell.c用于生成命令行模式的sqlite.exerTree.c是建立数据库R树索引的模块,fts3*.c是全文索引模块,这两个扩展模块直接编译的时候会提示以下错误,
1>fts3.obj : errorLNK2005: _sqlite3_extension_init 已经在 rtree.obj 中定义
1>fts3.obj : errorLNK2005: _sqlite3_api 已经在 rtree.obj 中定义
1>fts3_tokenizer.obj :error LNK2005: _sqlite3_api 已经在 rtree.obj 中定义
至于原因,一时半会儿也没找出来,就先不管它了,从项目中移除上面几个文件再编译就Ok了(移除Rtree.c是因为发现用其编译出来的库时会出错)。
(呵呵,初次测试的目的是基本应用,所以具体错误的原因就没深究,有兴趣的可以共同探讨一下,主要是Rtree和全文检索模块的应用)
接下里,我们在工程属性里,把“N”个警告忽略掉,配置属性àC/C++->高级à禁用特定警告里,设置“4267;4244;4018;4996;”。
然后再编译世界就清净了,呵呵,顺利编译出的有DLLLib文件,接下里我们对SQLite进行简单的功能测试,体验一下SQLite编程的便利。
/************************************************/
建立一个新的测试工程,这里我们选择MFC应用程序(DialogBased),例如项目SQLiteDEmo
在项目文件夹下建立一个Lib文件夹,把刚才生成的Lib文件和Sqlite3.h复制到该文件夹下,为了方便可以把SQLiteLibSQLiteDemo在一个解决方案里管理,设置共同的输出路径,并在生成时间里自动拷贝库文件,这样不用每次都手动来操作,还能保证用到的都是最新的编译版本。
SQLiteDemo项目属性里,配置属性à链接器à输入à附加依赖性,设置为“$(SolutionDir)lib\SQLite3.lib”,这样就把SQLite库引用到了我们的工程中。
然后,在用到SQLite的文件里包含头文件 #include "../lib/sqlite3.h"
/************************************************/
接下来,我们进行简单的SQLite应用。

  //连接数据库
void CSQLiteDemoDlg::OnBnClickedButtonConnect()
{
UpdateData();
m_strDB.Trim(_T(" \t\n"));;
if( m_strDB.IsEmpty() )
{
//AfxMessageBox(_T("请检查数据库参数!"));
m_strResult += _T("请检查数据库参数!\r\n");
return;
}
//
int result = 0;
//
LPSTR szTmp = new char[MAX_PATH];
wsprintfA(szTmp, "%ls", m_strDB);
result = sqlite3_open( szTmp, &m_db );//关键代码, 连接数据库
if( result )
{
//AfxMessageBox(_T("连接数据库失败!"));
m_strResult += m_strDB;
m_strResult += _T("\r\n");
m_strResult += _T("连接数据库失败!\r\n");
sqlite3_close(m_db);
}
else
{
m_strResult += m_strDB;
m_strResult += _T("\r\n");
SqliteQuery(_T("select name, sql from sqlite_master"));
//AfxMessageBox(_T("连接数据库成功!"));
m_strResult += _T("连接数据库成功!\r\n");
}
//
delete[] szTmp;
}

//执行语句
void CSQLiteDemoDlg::SqliteExec(CString strSQL)
{
strSQL.Trim(_T(" \t\n"));
if( strSQL.IsEmpty() )
{
//AfxMessageBox(_T("请检查参数!"));
m_strResult += _T("请检查执行语句!\r\n");
UpdateData(FALSE);
return;
}
//
int result = 0;
//
LPSTR szTmp = new char[MAX_PATH];
wsprintfA(szTmp, "%ls", strSQL);

LPSTR szMsg = NULL;

result = sqlite3_exec( m_db, szTmp, 0, 0, &szMsg);

if( result!=SQLITE_OK )
{
//AfxMessageBox(CString(szMsg));
m_strResult += CString(szMsg);
m_strResult += _T("\r\n");
}

delete[] szTmp;
}

//查询
void CSQLiteDemoDlg::SqliteQuery(CString strQuery)
{
m_strResult += _T("-----------------------------------\r\n");
double dbStartTime = clock();
//
char **ppTb = NULL;
int nRow, nCol;
nRow = nCol = 0;
//
strQuery.Trim(_T(" \t\n"));;
if( strQuery.IsEmpty() )
{
//AfxMessageBox(_T("请检查查询参数!"));
m_strResult += _T("请检查查询参数!\r\n");
return;
}
m_strResult += strQuery;
m_strResult += _T("\r\n");
int result = 0;
//
LPSTR szTmp = new char[MAX_PATH];
wsprintfA(szTmp, "%ls", strQuery);
LPSTR szMsg = NULL;
result = sqlite3_get_table( m_db, szTmp, &ppTb, &nRow, &nCol, &szMsg );
if( result!=SQLITE_OK )
AfxMessageBox(CString(szMsg));
else
{
CString strRes;
for( int i=0;i<=nRow;i++ )
{
strRes = _T("");
for( int j=0;j<nCol;j++ )
{
if( j>0 )
strRes += _T("\t|  ");
strRes += *(ppTb + i*nCol + j);
}
strRes += "\r\n";
m_strResult += strRes;
}
}
m_strResult += _T("-----------------------------------\r\n");
double dbEndTime = clock();
CString strTime;
strTime.Format(_T("查询花费时间: %.2f毫秒"), (double)(dbEndTime-dbStartTime));
m_strResult += strTime;
m_strResult += _T("\r\n");
//
sqlite3_free_table(ppTb);
delete[] szTmp;
UpdateData(FALSE);
}
///////////////////////////////////////////////////////////////////////////
以上是简单的功能测试,测试工程点击这里SQLiteDemo.zip这里 下载。
欢迎大家就SQLite进行交流,好东西大家分享~~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307607-1-1.html 上篇帖子: Android入门之数据库SQLite 下篇帖子: 【转】Android 中SQLite事务处理的简单例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表