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的响应函数中。这样我们就可以做出带有界面的数据库操作程序。这仅是一些简单的操作,要想做出一些有价值的东西,还需要更深的努力。

时间: 2024-12-19 15:35:53

sqlite与C++进行连接的相关文章

Sqlite的多表连接更新

最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅.最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦.sqliter并不支持常见的连接更新: update a set a.id =b.id from table_1 a inner join table_2 b on a.name=b.name 查了一下,只能这样: update table1 set col1=(select col1 from table2 where col

[ios]sqlite轻量级数据库学习连接

SQLLite (一)基本介绍 http://blog.csdn.net/lyrebing/article/details/8224431 SQLLite (二) :sqlite3_open, sqlite3_exec, slite3_close http://blog.csdn.net/lyrebing/article/details/8224802 SQLLite (三):sqlite3_prepare_v2,sqlite3_step http://blog.csdn.net/lyrebin

linq连接sqlite数据库(linq to sqlite) .net3.5

http://www.cnblogs.com/xianyin05/archive/2012/12/23/2829905.html using Models; using System; using System.Collections.Generic; using System.Data.SQLite; using System.Diagnostics; using System.Linq; using System.Text; namespace Demo2 { class Program {

使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)

在没有使用SQLite这种轻量级的数据库之前,只使用过Sqlserver2008进行数据的增删改查,公司使用的是大型的ORACLE数据库,还没有真正的会使用它.那时候觉得数据库很庞大,然而遇到SQLite以后,发现有这么个迷你的小数据库,就像女生的包包随身携带的小镜子一样,放在哪里都能使用. 废话少说,SQLite提供了如何连接.关闭等数据库操作,但真正的增.删.改.查等语句同Sqlserver.ORACLE是一样的. 首先,是创建SQLite数据库文件(写了一个方法): Public stat

sqlite helper

//-------------------------------------------------------------------------- // // Copyright (c) BUSHUOSX. All rights reserved. // // File: SqliteDbManager.cs // // Version:1.0.0.0 // // Datetime: // //------------------------------------------------

SQLite剖析之C/C++接口

前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的: * 支持UTF-16编码 * 用户自定义的文本比较方法 * 可以对BLOBs字段建立索引     由于对于C语言应该用什么数据类型来存放UTF-16编码的字符串并没有一致的规范,因此SQLite使用了普通的void*类型来指向UTF-16编码的字符串. 客户端使用过程中可以把void*映射成适合他们的系统的

SQLite语句小结

一.创建数据库: 1.点击connection,选择SQLite 2.输入“连接名”和“选择保存数据库的路径” 3.选择完路径之后,双击“连接名”,出来main(如图) 4.右击main,选择New Query...,(打开一个新窗口) 5.SQ语句: PS:先明白几个名词概念: a.表名:t_people(格式t_名字).一张表对应一个表名.在一个数据库中可以存在很多表. b.关键字. c.字段.一张表可以有很多字段,一个字段是一列.但是有且只能有一个字段是主键.主键用来唯一标识一条记录.(r

轻量级数据库sqlite的接口说明

原文地址:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了. 使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare

SQLite剖析之编程接口详解

前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_finalize() sqlite3_close() 这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_column()表示的是对查询获得一行里面的数据的列的各个操作统称,实际上在sqlite中并不存在这个函数. 1.sqlite3_open() 该函数用来打开数据库.在操作数据库之前,