一步一步实现C++操作SQLite数据库
SQLite,是一款轻型的数据库,是遵守ACID的关联式关系数据库,目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同样的代码可以实现跨平台编译,这个数据库和微软的Access很象,都是小型的数据库管理系统,最大的差别为sqlite不需要office的支持,可以完全开源,是真正意义上的跨平台的数据库。
由于工作的需要,这几天对sqlite数据库研究一下,并使用C++对其进行了简单的操作。中间遇到了很多问题,找到了很多资料终于解决了。总结问题,不管提高,所以把遇到的问题和解决办法写出来,希望对大家有用。
1:下载源码并编译
我下的版本为sqlite-amalgamation-3070701.zip,这个包含了主要的源代码。sqlite-dll-win32-x86-3070701.zip这个是Windows下的编译好的DLL文件和def文件,解压缩后包含两个文件,sqlite3.def和sqlite3.dll。
编译源代码很简单,新建立一个C++空项目,把sqlite-amalgamation-3070701.zip解压缩后的文件拷进去,编译、链接,就行了。
我的目的是把sqlite数据库作为自己项目中的一部分,是作为嵌入的一部分使用的。这个要利用到sqlite3.dll文件。可是源文件只有sqlite3.def和sqlite3.dll没有sqlite3.lib文件,怎么用呢?
LIB文件和DLL文件其实是差不多的,只是使用的时间不同。LIB文件使用在编译阶段DLL文件使用在运行阶段。根据def文件可以生成对应的LIB文件。以下是命令行生成LIB文件。
找到VS的安装路径,我的是D:\ProgramFiles\,用命令行进入以下路径。
D:\ProgramFiles\MicrosoftVisualStudio9.0\VC\bin>lib/def:sqlite3.def/machine:ix86
问题一:mspdb80.dll无法找到
原因是当前路径下没有“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件。
解决办法:Common7\IDE\下复制这四个文件到VC\Bin\下即可解决。
对应生成lib文件需要注意的是把sqlite3.def拷到上述路径下,使用命令行生成后会产生sqlite3.lib文件,这个就是在程序中编译时需要的文件。显示的结果为:
Microsoft(R)LibraryManagerVersion9.00.21022.08
Copyright(C)MicrosoftCorporation.Allrightsreserved.
正在创建库sqlite3.lib和对象sqlite3.exp
2:在C++中操作SQLite数据库
问题二:没有找到sqlite3.dll,因此这个应用程序未能启动
我在我把sqlite3.dll,sqlite3.h,sqlite3.lib拷到同一个文件夹里,编译时已知出现这个问题。
原来是程序执行时需要的DLL按照当前工作路径、系统目录的顺序搜索DLL文件。我的DLL文件没有和可执行文件在同一个路径下,肯定要出错了。明白这些,把sqlite3.dll拷到Debug文件夹下,问题解决了。
3:演示代码
主要的源代码来自网上,这个是我修改过的。
- #include<iostream>
-
usingnamespacestd;
-
#include"./sqlite/sqlite3.h"
-
#pragmacomment(lib,"./sqlite/sqlite3.lib")
-
staticint_callback_exec(void*notused,intargc,char**argv,char**aszColName)
- {
-
inti;
-
for(i=0;i<argc;i++)
- {
-
printf("%s=%s\n",aszColName[i],argv[i]==0?"NUL":argv[i]);
- }
-
return0;
- }
-
intmain(intargc,char*argv[])
- {
-
constchar*file="test.db";
-
constchar*sSQL="select*fromstu;";
-
char*pErrMsg=0;
-
intret=0;
- sqlite3*db=0;
-
ret=sqlite3_open("./test.db",&db);
-
if(ret!=SQLITE_OK)
- {
-
fprintf(stderr,"Couldnotopendatabase:%s",sqlite3_errmsg(db));
- exit(1);
- }
-
printf("Successfullyconnectedtodatabase\n");
- sqlite3_exec(db,sSQL,_callback_exec,0,&pErrMsg);
-
if(ret!=SQLITE_OK)
- {
-
fprintf(stderr,"SQLerror:%s\n",pErrMsg);
- sqlite3_free(pErrMsg);
- }
- sqlite3_close(db);
- db=0;
-
return0;
- }
#include <iostream>
using namespace std;
#include "./sqlite/sqlite3.h"
#pragma comment(lib, "./sqlite/sqlite3.lib")
static int _callback_exec(void * notused,int argc, char ** argv, char ** aszColName)
{
int i;
for ( i=0; i<argc; i++ )
{
printf( "%s = %s\n", aszColName[i], argv[i] == 0 ? "NUL" : argv[i] );
}
return 0;
}
int main(int argc,char * argv[])
{
const char * file ="test.db";
const char * sSQL = "select * from stu;";
char * pErrMsg = 0;
int ret = 0;
sqlite3 * db = 0;
ret = sqlite3_open("./test.db", &db);
if ( ret != SQLITE_OK )
{
fprintf(stderr, "Could not open database: %s", sqlite3_errmsg(db));
exit(1);
}
printf("Successfully connected to database\n");
sqlite3_exec( db, sSQL, _callback_exec, 0, &pErrMsg );
if ( ret != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", pErrMsg);
sqlite3_free(pErrMsg);
}
sqlite3_close(db);
db = 0;
return 0;
}
4:SQLite使用小问题说明
我在命令行操作SQLite数据库时,进入后一直不能生成一个数据库,并且生成表的命令也不成功。
后来终于明白了,SQLite命令行的形式为:sqlite.exedbfile,后面的即为数据库名,如果不存在,在操作后会自动生成一个数据库名。
SQLite的SQL命令都是以“;”为结束符,开始一直执行不成功,原来是没有加入“;”语句结束符号。
终于完成了一个简单的操作SQLite的程序。
分享到:
相关推荐
首先,为了在C++中操作SQLite数据库,我们需要包含SQLite的C++接口库,如sqlite3.h头文件。这个库提供了API,允许开发者直接在代码中执行SQL命令。 安装SQLite库通常涉及下载预编译的库文件或源代码,并将其添加到...
本话题主要围绕如何使用C++结合MySQL的头文件(.h)、库文件(.lib)以及动态链接库文件(.dll)来实现数据库操作。 首先,我们需要安装MySQL的C++开发库,这通常包含所需的头文件和库文件。这些文件用于编译和链接...
在C++环境中,SQLite3提供了丰富的API接口供开发者调用,实现对数据库的操作。本资源是针对Visual Studio 2013 X64平台的SQLite3 C++静态库,它允许你在64位环境下直接将SQLite3的功能整合到你的C++项目中,无需额外...
在本课程中,我们将深入探讨如何使用Qt框架与SQLite数据库进行交互,构建一个功能完备的查询系统。Qt是一个跨平台的C++库,提供了一整套工具,使得开发者能够创建图形用户界面(GUI)应用程序,同时也支持数据库操作...
通过调用这个函数,开发者可以为已打开的SQLite数据库设置加密密钥。这一步通常在数据库初始化时进行,密钥一旦设置,所有后续的数据读写都将受到这个密钥的保护。如果尝试打开一个已经加密的数据库而没有提供正确的...
1. **Qt与SQLite的集成**:在Qt中,SQLite数据库的访问是通过QSqlDatabase类来实现的。首先需要引入Qt的SQL模块,并通过`QSqlDatabase::addDatabase()`方法注册SQLite驱动,然后通过`QSqlDatabase::open()`打开...
C语言程序调用SQLite涉及到几个关键步骤和知识点,从标题来看,我们需要了解C语言如何与SQLite数据库交互,包括如何打开和关闭数据库,如何执行SQL命令等。接下来,我们详细阐述这些步骤和相关知识点。 首先,了解...
在Windows环境中,`sqlite3.dll`是SQLite3数据库引擎的实现,当你在应用程序中使用SQLite3时,需要将这个库文件与你的可执行文件一起分发,以确保程序能够正常运行。`sqlite3.h`则包含了所有关于SQLite3的函数声明、...
QSQLite库为开发者提供了一组C++类,使得操作SQLite数据库变得简单且直观。 在这个基于QT5.9.4的qsqlite数据库小程序中,我们可以预期实现以下功能: 1. 数据库连接:使用QSqlDatabase类,可以轻松地创建、打开或...
在本文中,我们将深入探讨如何使用Qt框架在嵌入式平台上创建C++工程,并测试其是否能够成功连接并操作SQLite3数据库。首先,我们需要了解Qt和SQLite3的基础知识,然后介绍在A8处理器上进行交叉编译的过程。 Qt是一...
在一组数据库操作中,如果任何一步失败,可以回滚所有改变,保持数据库的完整性。 7. **预编译语句**: 使用QSqlQuery的prepare()方法可以预编译SQL语句,提高性能,防止SQL注入攻击。 8. **数据库模型视图架构**: ...
SQLCipher 是一个针对 SQLite 数据库的开源扩展,专门设计用于在本地存储中实现256位AES(高级加密标准)加密。这使得敏感数据的安全存储成为可能,尤其适用于那些需要保护用户隐私的应用程序。在C++环境中,...
SQLite是一款开源、轻量级的嵌入式数据库引擎,它被广泛应用于各种操作系统和应用程序中。"sqlite-autoconf-3220000.tar.gz" 是...用户可以利用这个包来定制自己的SQLite数据库引擎,并将其集成到各类应用程序中。
SQLite注册器则是用于管理和操作SQLite数据库的一个工具,尤其在Windows操作系统下,它可以帮助用户注册SQLite的动态链接库(dll)文件,以便系统能够识别并正确调用SQLite的功能。 SQLite的核心特性包括: 1. **...
在处理多个SQLite数据库时,有时需要将一个数据库中的表复制到另一个数据库中,这可能是因为数据库版本差异、数据同步需求或是备份恢复操作。以下将详细介绍如何在SQLite数据库之间复制表。 1. 使用SQLite Manager...
SQLite提供了`sqlite3.exe`命令行工具进行数据库的备份和恢复,通过导出`.sql`文件或复制数据库文件实现。 通过以上步骤,我们可以深入理解SQLite的使用,并能将其应用于实际项目中。这个实例旨在覆盖SQLite的基本...
总的来说,"sqlite-autoconf-3260000.tar"提供了SQLite数据库系统的一个完整源代码包,通过autoconf工具简化了在不同平台上的构建和安装流程,让开发者能够轻松地将SQLite集成到他们的应用程序中。
SQLite3是一款轻量级的数据库管理系统,广泛应用于嵌入式设备和各种操作系统,包括Linux。它的特点是无需独立服务器进程,可以直接在用户空间运行,极大地简化了数据库的部署和使用。这个压缩包“sqlite-3.6.14.2”...
比如,当用户借阅图书时,需要同时更新图书状态和借阅记录,如果任何一步失败,则整个操作应回滚。 错误处理和异常处理也是系统的重要组成部分。C++的异常处理机制使得程序能够在遇到错误时优雅地恢复,而不是突然...