[原]SQLite的学习系列之获取数据库版本二

本系列文章主要是使用C++语言来调用其API,达到管中窥豹的目的。另外本文使用的开发环境为mac + clion,并且基于SQLite 3.7.14来进行开发.

  一、去下载sqlite-amalgamation-3071400.zip,然后解压到文件夹(其结构目录树如下):

    .

    ├── shell.c

    ├── sqlite3.c

    ├── sqlite3.h

    └── sqlite3ext.h

  二、新建一个sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷贝到sql_src目录下:

    .

    ├── main.cpp

    └── sql_src

    ├── sqlite3.c

    └── sqlite3.h

  

  三、在main.cpp中调用sqlite的代码如下:

    

/**
 * We get the version of the SQLite database. This time we will use an SQL query.
 */
#include <iostream>
#include "./sql_src/sqlite3.h"

using namespace std;

int main() {
    sqlite3 *db;
    sqlite3_stmt *res;

    const char *file = "test.db";
    int rc = sqlite3_open(file, &db);

    if (rc != SQLITE_OK) {
        cout << "Cannot open database: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);

        exit(1);
    }

    rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);
    if (rc != SQLITE_OK) {
        cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);
        exit(1);
    }

    rc = sqlite3_step(res);

    if (rc == SQLITE_ROW) {
        cout << sqlite3_column_text(res, 0) << endl;
    }

    sqlite3_finalize(res);
    sqlite3_close(db);
    return 0;
}

  四、最后的运行结果如下:

  

3.7.14

Process finished with exit code 0

  

  调用分析:

sqlite3 *db;

  1、该sqlite3的结构定义了一个数据库句柄。每个打开的SQLite数据库是由数据库句柄表示。

sqlite3_stmt *res;

  2、该sqlite3_stmt结构代表一个SQL语句。

int rc = sqlite3_open(file, &db);

  3、该sqlite3_open()函数打开一个新的数据库连接。其参数是数据库名称和数据库句柄。在“test.db的”是采用了特殊的数据库名称导致打开一个内存数据库。函数的返回码指示数据库是否被成功打开。当连接成功建立,则返回SQLITE_OK。

if (rc != SQLITE_OK) {
        cout << "Cannot open database: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);

        exit(1);
    }

  4、如果返回代码指示错误,我们打印邮件到控制台,关闭数据库处理,并终止该计划。该sqlite3_errmsg()函数返回错误的描述。它是否被打开时发生错误,与数据库连接句柄相关联的资源,应通过使其向sqlite3_close()函数释放。

rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);
    if (rc != SQLITE_OK) {
        cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);
        exit(1);
    }

  5、执行SQL语句之前,必须调用首先被编译成字节代码的sqlite3_prepare功能之一。 (该sqlite3_prepare()函数被弃用。)

  sqlite3_prepare_v2()函数有五个参数。

  第一个参数是从所述sqlite3_open()函数获得的数据库句柄。

  第二个参数是要编译的SQL语句。

  第三个参数为以字节为单位的SQL语句的最大长度。传递-1会导致读取SQL字符串到第一个零终止子字符串结束了。根据该文件,可以通过传递提供的SQL字符串的字节的确切数量获得一些小的性能优势。

  第四个参数是语句句柄。这将指向预编译的语句,如果sqlite3_prepare_v2()成功运行

  最后一个参数是一个指向SQL语句的未使用的部分。只有SQL字符串的第一个语句被编译,所以参数指向剩下什么未编译。我们传入0,因为该参数对我们不是很重要。

  如果成功,sqlite3_prepare_v2()返回SQLITE_OK;否则错误代码返回

  

rc = sqlite3_step(res);

  6、调用sqlite3_step()运行SQL语句。 SQLITE_ROW返回码表示有另一行准备。我们的SQL语句返回只有一行数据,因此,我们调用这个函数一次。

  

sqlite3_finalize(res);

  7、该sqlite3_finalize()函数销毁准备语句对象。

sqlite3_close(db);

  8、该sqlite3_close()函数关闭数据库连接。

  

时间: 2024-10-08 04:02:49

[原]SQLite的学习系列之获取数据库版本二的相关文章

[原]SQLite的学习系列之获取数据库版本

最先了解到SQLite是基于其作为移动客户端数据存储平台,以下是其官网(https://www.sqlite.org/)关于SQLite的一段介绍: SQLite是遵守ACID的轻型数据库引擎,它包含在一个相对小的C库中.它是D.RichardHipp创建的公有领域项目.SQLite第一个Alpha版本诞生于2000年5月,至今已经有16个年头,当前版本为3.12.2..不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要

【SQL Server 学习系列】-- 获取字符串中出现某字符的次数及字符某次出现的下标

DECLARE @Str NVARCHAR(500) = '1_BB_CC_DD_AA_EE_YY_WW_HH_GG' --// 1. 获取下划线在字符串中出现的次数 SELECT LEN(@Str) - LEN(REPLACE(@Str, '_', '')) --// 2. 获取下划线某次出现的位置下标 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IndexNumOfStr]') AND t

Python学习(十七)—— 数据库(二)

一. 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上.如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题. 但是很不幸,上述假设存在以下几个问题...... 1.程序所有的组件就不可能运行在一台机器上 #因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器机器的性能总归是有限的,受限于目前的硬件水平,就一台机器的

CSS3学习系列之盒样式(二)

text-overflow属性 当通过把overflow属性的属性值设定为"hidden"的方法,将盒中容纳不下的内容隐藏起来时,如果使用text-overflow属性,可以在盒的末尾显示一个代表省略号"-".但是,text-overflow属性只在当盒中的内容在水平方向上超出盒的容纳范围时有效.例子如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha

[原]零基础学习在Android进行SDL开发系列文章

[原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图 [原]零基础学习SDL开发之在Android使用SDL2.0渲染PNG图片 [原]零基础学习SDL开发之在Android使用SDL2.0加载字体 [原]零基础学习在Android进行SDL开发后记 [原]零基础学习在Android进行SDL开发系列文章,布布扣,bubuko.com

[原]零基础学习视频解码系列文章

注:本系列文章的开发环境:Ubuntu 14.04+Eclipse4.3.2+CDT+FFmpeg2.3+SDL1.25 [原]零基础学习视频解码之安装ffmpeg [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构 [原]零基础学习视频解码之解码图像 [原]SDL开发教程 [原]零基础学习视频解码之解码声音 [原]零基础学习视频解码之视频线程 [原]零基础学习视频解码之同步视频 [原]零基础学习视频解码之同步音频 [原]零基础学习视频解码之seek [原]零基础学习视频解码之后

oracle学习入门系列之四 oracle数据库简介

oracle学习入门系列之四 oracle数据库简介 终于平滑过渡到oracle了,我们在第一篇中黑了拉里一次,这里就需要给拉里洗白了.话说当年钱钟书先生写完<围城>之后,无意中说,一个鸡蛋就算好吃,也没必要知道下蛋的母鸡是哪只.蛤蟆觉得有点不妥,钱钟书先生那是文人,自然要清高,而且他本是"下蛋"的母鸡当然不愿意被吃蛋的俗人打扰的,况且当时也没有统计粉丝一说.可是我们是吃蛋的啊,而且是大老粗,现在还统计粉丝数量,我们就需要知道谁下的蛋,是不是毒蛋,对不对?也得看看下了这么好

Dubbo学习系列之十三(Mycat数据库代理)

软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Cat更亲切?那现在就来认识下这只小猫吧. 数据库的核心地位就不说了,但现在的问题是,各种RDB,各种NoSQL交织,又是分布式.多租户的场景下,心里有没有十足的把握能稳住如此局面呢.有需求,就有市场!自然,相应的技术也应运而生,Mycat作为一款DB中间件,可以作为应用和DB间的“桥梁”,让后台DB的

JDBC学习笔记(6)——获取自动生成的主键值&amp;处理Blob&amp;数据库事务处理

获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * 获取数据库自动生成的主键 3 */ 4 @Test 5 public void testGetKeyValues(){ 6 Connection connection=null; 7 PreparedStatement preparedStatement=null; 8 ResultSet rs=n