sqlite与C++进行连接
SQLite数据库是零配置的,sqlite数据库不同于SqlServer等数据库,SQLite不需要复杂配置,只需要,将SQLite的库文件和动态链接文件拷贝到相应工程目录下,就可以使用SQLite数据库,只是用到数据库基本操作的同学们,建议选择SQLite数据库,为大家介绍一下使用SQLite数据库API函数来实现一些基本操作。
Sqlite应用与嵌入式,应为小巧方便,而且没有其他数据库的复杂配置,我们在写一些小程序或者对数据库不是很复杂的操作的情况下,sqlite是不错的选择 。
我们使用sqlite时需要下下载它的压缩包,网上有很多,
解压后,我们可以看到存在 其中我们需要的sqlite3.h和sqlite3.lib以及sqlite3.dll三个文件,接下来我们需要配置我们的编译器(vc6.0或者VS,其步骤都一样)
(1)首先,打开VS编译器,新建WIN32 控制台程序,F7编译,运行(当然什么都没有,目的是得到debug文件)
(2)然后我们把已经下载的SQLite3.h,SQLite3.lib拷贝到新建的TestSqlite目录下。然后把sqlite3.h拷贝到debug目录下。其实只要把这几个文件拷贝到程序的目录下即可,到时候我们可以在include中加上路径,同样也能找到。
上面这种加载库文件的方法,有一定弊端(万一我们要引用的文件很多,都拷贝到程序目录下,会很麻烦),第二种方法是使用VS2010编译器所带的功能:我们点击“项目”->“属性”-> 链接器,在附加包含目录里面添加我们所用到的库文件(lib)(输入头文件或者包含文件所在的文件目录),然后在附加库目录里面添加我们用到的库文件的名字(库文件所在的文件目录)。注意添加的时候用逗号隔开(此时我们仍然要把动态链接文件拷贝到程序目录下),这样我们就完成了库文件的加载。方法如下:
(3)
(4)附加包含目录
(5)附加依赖项
以上使用第三方库的方法请看如何使用第三方库 http://blog.csdn.net/u014028070/article/details/42278007
以上方法相当与我们把库文件包含进来,以便调用。然后我们在主程序的头文件中加入如下头文件(sqlite的API函数所在的头文件)。然后我们编译下,检查前面的操作是否正确。
此时我们在程序中使用sqliteAPI函数来操作数据库。首先是创建数据库,此时,我们定义一个sqlite操作句柄(以后的打开,插入,执行等动作都是由句柄来执行的),然后定义一个字符指针,和数组,指针用来传递错误信息,数组用来存放我们的sql语句。如图:
sqlite3_open()函数用来打开一个数据库,若存在,则直接打开,若不存在,则建立一个。
运行一下。
此时我们进入程序的目录下,会发现多了一个后缀名为db的文件,这就是我们创建的数据库,右键属性,看到大小为0kb(因为里面没有插入数据)。
此时,我们进行插入数据操作,插入操作首先要建立数据所属的属性(关系数据库的概念),我们在数据库中增加三个属性,分别是sno,sname,sex。分别是整形,动态字符型,字符型。
<span style="font-size:18px;"> sqlite3 * conn = NULL;
char * err_msg = NULL;
char sql[200] = "" ;
// 打开数据库, 创建连接
if(sqlite3_open("student.db", &conn) != SQLITE_OK)
{
cout<<"无法打开!";
} //创建表 student 创建表以后 不能重复创建
sprintf(sql, "CREATE TABLE student_for_table \
(sno int, sname varchar(20), age int)");
if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
{
cout<<"操作失败,错误代码: %s"<< err_msg;
exit(-1);
} </span>
然后我们执行插入操作。(这里只是一个插入数据的演示)
<span style="font-size:18px;">int main(int argc, _TCHAR* argv[])
{
sqlite3 * conn = NULL;
char * err_msg = NULL;
char sql[200] = "" ;
// 打开数据库, 创建连接
if(sqlite3_open("student.db", &conn) != SQLITE_OK)
{
cout<<"无法打开!";
} //创建表 student 创建表以后 不能重复创建
sprintf(sql, "CREATE TABLE student_for_table \
(sno int, sname varchar(20), age int)");
if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
{
cout<<"操作失败,错误代码: %s"<< err_msg;
exit(-1);
} //表创建完成,插入数据
for (int i = 0; i < 10; i++)
{
// 执行SQL
sprintf(sql, "INSERT INTO student_for_table \
(sno, sname, age) VALUES \
(%d, '%s', %d)", i, "students", i);
if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
{
cout<<"操作失败,错误代码: %s"<< err_msg;
exit(-1);
}
}</span>
<span style="font-size:18px;">}</span>
然后执行,我们进入程序目录,然后可以看出来数据库的大小已经不是空了。
插入数据后,当然我们需要读出来然后显示,所以添加如下代码。
//把数据读出来,进行显示,sqlite3_exec()执行,调用回调函数,显示的操作写在回填函数中
<span style="font-size:18px;"> sprintf(sql, "SELECT * FROM student_for_table");
sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg);
</span>
要读出数据,我们要定义一个回调函数:
<span style="font-size:18px;">//为了数据读出来,使用回调函数
int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames)
{
for (int i = 0; i < 3; i++)
{
printf("%s\t", colValues[i]);
}
printf("\n"); return 0;
}</span>
以上最后的程序如下:
<span style="font-size:18px;">// TestSqlite.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include"sqlite3.h"
using namespace std;
#pragma comment(lib,"sqlite3.lib") //为了数据读出来,使用回调函数
int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames)
{
for (int i = 0; i < 3; i++)
{
printf("%s\t", colValues[i]);
}
printf("\n"); return 0;
} int main(int argc, _TCHAR* argv[])
{
sqlite3 * conn = NULL;
char * err_msg = NULL;
char sql[200] = "" ;
// 打开数据库, 创建连接
if(sqlite3_open("student.db", &conn) != SQLITE_OK)
{
cout<<"无法打开!";
} //创建表 student 创建表以后 不能重复创建
sprintf(sql, "CREATE TABLE student_for_table \
(sno int, sname varchar(20), age int)");
if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
{
cout<<"操作失败,错误代码: %s"<< err_msg;
exit(-1);
} //表创建完成,插入数据
for (int i = 0; i < 10; i++)
{
// 执行SQL
sprintf(sql, "INSERT INTO student_for_table \
(sno, sname, age) VALUES \
(%d, '%s', %d)", i, "students", i);
if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
{
cout<<"操作失败,错误代码: %s"<< err_msg;
exit(-1);
}
} //把数据读出来,进行显示,sqlite3_exec()执行,调用回调函数,显示的操作写在回填函数中
sprintf(sql, "SELECT * FROM student_for_table");
sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg); //操作完数据库后,一定要 关闭连接。
if (sqlite3_close(conn) != SQLITE_OK)
{
cout<<"无法关闭,错误代码: %s\n"<< sqlite3_errmsg(conn)<<endl;;
exit(-1);
} cout<<"操作成功"<<endl;
return 0;
}
</span>
运行结果如下:
上面演示的是C++如何与sqlite连接,同时我们也可以将mfc与sqlite联合起来使用,做出带界面的操作,其核心的思想是一致的,只是把对sqlite数据库的操作放在不同的响应函数中(mfc以消息传递),比如我们把“打开数据库”操作放在一个button的响应函数中。这样我们就可以做出带有界面的数据库操作程序。这仅是一些简单的操作,要想做出一些有价值的东西,还需要更深的努力。
sqlite与C++进行连接的更多相关文章
- sqlite数据库如何远程连接?
sqlite数据库如何远程连接代码如下:QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE"); db.setHostName( ...
- SQLite中的内连接简化技巧
SQLite中的内连接简化技巧 在SQLite中,通过内连接可以将两个表通过条件表达式关联起来,构成一个新记录集或视图.形式如下: SELECT ... FROM t1 JOIN t2 ON ...
- Sqlite的多表连接更新
最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅.最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦.sqliter并不支持常见的连 ...
- [ios]sqlite轻量级数据库学习连接
SQLLite (一)基本介绍 http://blog.csdn.net/lyrebing/article/details/8224431 SQLLite (二) :sqlite3_open, sql ...
- SQLite使用EF6的连接配置
在配置文件中配置连接字符串 1. 使用nuget安装SQLite Install-Package System.Data.SQLite 安装好后的依赖项有: System.Data.SQLite.dl ...
- linq连接sqlite数据库(linq to sqlite) .net3.5
http://www.cnblogs.com/xianyin05/archive/2012/12/23/2829905.html using Models; using System; using S ...
- SQLite应用之实例代码
目录 一.获取表的Schema信息 二.常规数据插入 三.高效的批量数据插入 四.数据查询 一.获取表的Schema信息 1). 动态创建表. 2). 根据sqlite3提供的API,获取 ...
- SQLite剖析之编程接口详解
前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fina ...
- SQLite剖析之C/C++接口
前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的:支持UTF ...
随机推荐
- Atom markdown .md 编写格式技巧
使用Atom预览markdown 1.打开任意.md文件(markdown源文件) 菜单栏File->Open file...(ctrl+o)打开文件: 2.windows下使用快捷键 ctrl ...
- C++ 必知必会: 条款1: 数据抽象
数据抽象, 具有C语言经理的我, 原先是将其看做是一个数据的集合, 把自己常用的数据通过某种方式总结,集合起来, 使用的时候能够更加方便------其实这个还是结构体思想的延续,结构体内部包含了若干的 ...
- WindowsPhone使用HtmlAgilityPack解析HTML
NuGet里添加HtmlAgilityPack的引用 然后wp上使用必须添加本地 C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libr ...
- C++ sstream 中处理字符串
C++引入ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含<sstream>这个头文件. istringstream的 ...
- RECT 数据结构
数据结构RECT定义了一个矩形的左上角和右下角的坐标 ? 1 2 3 4 5 6 7 8 typedef struct _RECT{ LONG left; LONG t ...
- js设计模式(12)---职责链模式
0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...
- Windows Server 2003 增加远程用户个数
1.进入“开始”-“控制面板”-“添加或删除程序”如下图: 2.点击“添加/删除windows组件(A)”,进入如下图 如果该服务器没有安装“终端服务器”和“终端服务器授权”组件的话,则需要使用系统光 ...
- 设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身
设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身. 方法: (1)界面操作,把DataGridView控件拖放在窗体中,就看到DataGridView控件的右上角有个小三角, ...
- select @@IDENTITY
用select @@identity得到最新一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY 说明: 在一条 INSERT.SEL ...
- ES2015 ——let命令的暂时性死区
ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 和var不同的还有,let命令不存在变量提升,所以声明前调用变量,都会报错,这就涉及到 ...