SQLite教程(十三):C语言编程实例代码(1)


一、获取表的Schema信息:

    1). 动态创建表。

    2). 根据sqlite3提供的API,获取表字段的信息,如字段数量以及每个字段的类型。

    3). 删除该表。

    见以下代码及关键性注释:

复制代码 代码如下:

#include <sqlite3.h>
#include <string>

using namespace std;

void doTest()
{
    sqlite3* conn = NULL;
    //1. 打开数据库
    int result = sqlite3_open("D:/mytest.db",&conn);
    if (result != SQLITE_OK) {
        sqlite3_close(conn);
        return;
    }
    const char* createTableSQL =
        "CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)";
    sqlite3_stmt* stmt = NULL;
    int len = strlen(createTableSQL);
    //2. 准备创建数据表,如果创建失败,需要用sqlite3_finalize释放sqlite3_stmt对象,以防止内存泄露。
    if (sqlite3_prepare_v2(conn,createTableSQL,len,&stmt,NULL) != SQLITE_OK) {
        if (stmt)
            sqlite3_finalize(stmt);
        sqlite3_close(conn);
        return;
    }
    //3. 通过sqlite3_step命令执行创建表的语句。对于DDL和DML语句而言,sqlite3_step执行正确的返回值
    //只有SQLITE_DONE,对于SELECT查询而言,如果有数据返回SQLITE_ROW,当到达结果集末尾时则返回
    //SQLITE_DONE。
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        sqlite3_finalize(stmt);
        sqlite3_close(conn);
        return;
    }
    //4. 释放创建表语句对象的资源。
    sqlite3_finalize(stmt);
    printf("Succeed to create test table now.\n");
    //5. 构造查询表数据的sqlite3_stmt对象。
    const char* selectSQL = "SELECT * FROM TESTTABLE WHERE 1 = 0";
    sqlite3_stmt* stmt2 = NULL;
    if (sqlite3_prepare_v2(conn,selectSQL,strlen(selectSQL),&stmt2,NULL) != SQLITE_OK) {
        if (stmt2)
            sqlite3_finalize(stmt2);
        sqlite3_close(conn);
        return;
    }
    //6. 根据select语句的对象,获取结果集中的字段数量。
    int fieldCount = sqlite3_column_count(stmt2);
    printf("The column count is %d.\n",fieldCount);
    //7. 遍历结果集中每个字段meta信息,并获取其声明时的类型。   
    for (int i = 0; i < fieldCount; ++i) {
        //由于此时Table中并不存在数据,再有就是SQLite中的数据类型本身是动态的,所以在没有数据时
        //无法通过sqlite3_column_type函数获取,此时sqlite3_column_type只会返回SQLITE_NULL,
        //直到有数据时才能返回具体的类型,因此这里使用了sqlite3_column_decltype函数来获取表声
        //明时给出的声明类型。
        string stype = sqlite3_column_decltype(stmt2,i);
        stype = strlwr((char*)stype.c_str());
        //下面的解析规则见该系列的“数据类型-->1. 决定字段亲缘性的规则”部分,其链接如下:
        //http://www.phpstudy.net/article/65424.htm
        if (stype.find("int") != string::npos) {
            printf("The type of %dth column is INTEGER.\n",i);
        } else if (stype.find("char") != string::npos
            || stype.find("text") != string::npos) {
            printf("The type of %dth column is TEXT.\n",i);
        } else if (stype.find("real") != string::npos
            || stype.find("floa") != string::npos
            || stype.find("doub") != string::npos ) {
            printf("The type of %dth column is DOUBLE.\n",i);
        }
    }
    sqlite3_finalize(stmt2);
    //8. 为了方便下一次测试运行,我们这里需要删除该函数创建的数据表,否则在下次运行时将无法
    //创建该表,因为它已经存在。
    const char* dropSQL = "DROP TABLE TESTTABLE";
    sqlite3_stmt* stmt3 = NULL;
    if (sqlite3_prepare_v2(conn,dropSQL,strlen(dropSQL),&stmt3,NULL) != SQLITE_OK) {
        if (stmt3)
            sqlite3_finalize(stmt3);
        sqlite3_close(conn);
        return;
    }
    if (sqlite3_step(stmt3) == SQLITE_DONE) {
        printf("The test table has been dropped.\n");
    }
    sqlite3_finalize(stmt3);
    sqlite3_close(conn);
}

int main()
{
    doTest();
    return 0;
}
//输出结果为:
//Succeed to create test table now.
//The column count is 3.
//The type of 0th column is INTEGER.
//The type of 1th column is DOUBLE.
//The type of 2th column is TEXT.
//The test table has been dropped.

二、常规数据插入:

    1). 创建测试数据表。
    2). 通过INSERT语句插入测试数据。
    3). 删除测试表。
    见以下代码及关键性注释:

复制代码 代码如下:

#include <sqlite3.h>
#include <string>
#include <stdio.h>

using namespace std;

void doTest()
{
    sqlite3* conn = NULL;
    //1. 打开数据库
    int result = sqlite3_open("D:/mytest.db",&conn);
    if (result != SQLITE_OK) {
        sqlite3_close(conn);
        return;
    }
    const char* createTableSQL =
        "CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)";
    sqlite3_stmt* stmt = NULL;
    int len = strlen(createTableSQL);
    //2. 准备创建数据表,如果创建失败,需要用sqlite3_finalize释放sqlite3_stmt对象,以防止内存泄露。
    if (sqlite3_prepare_v2(conn,createTableSQL,len,&stmt,NULL) != SQLITE_OK) {
        if (stmt)
            sqlite3_finalize(stmt);
        sqlite3_close(conn);
        return;
    }
    //3. 通过sqlite3_step命令执行创建表的语句。对于DDL和DML语句而言,sqlite3_step执行正确的返回值
    //只有SQLITE_DONE,对于SELECT查询而言,如果有数据返回SQLITE_ROW,当到达结果集末尾时则返回
    //SQLITE_DONE。
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        sqlite3_finalize(stmt);
        sqlite3_close(conn);
        return;
    }
    //4. 释放创建表语句对象的资源。
    sqlite3_finalize(stmt);
    printf("Succeed to create test table now.\n");

    int insertCount = 10;
    //5. 构建插入数据的sqlite3_stmt对象。
    const char* insertSQL = "INSERT INTO TESTTABLE VALUES(%d,%f,'%s')";
    const char* testString = "this is a test.";
    char sql[1024];
    sqlite3_stmt* stmt2 = NULL;
    for (int i = 0; i < insertCount; ++i) {
        sprintf(sql,insertSQL,i,i * 1.0,testString);
        if (sqlite3_prepare_v2(conn,sql,strlen(sql),&stmt2,NULL) != SQLITE_OK) {
            if (stmt2)
                sqlite3_finalize(stmt2);
            sqlite3_close(conn);
            return;
        }
        if (sqlite3_step(stmt2) != SQLITE_DONE) {
            sqlite3_finalize(stmt2);
            sqlite3_close(conn);
            return;
        }
        printf("Insert Succeed.\n");
    }
    sqlite3_finalize(stmt2);
    //6. 为了方便下一次测试运行,我们这里需要删除该函数创建的数据表,否则在下次运行时将无法
    //创建该表,因为它已经存在。
    const char* dropSQL = "DROP TABLE TESTTABLE";
    sqlite3_stmt* stmt3 = NULL;
    if (sqlite3_prepare_v2(conn,dropSQL,strlen(dropSQL),&stmt3,NULL) != SQLITE_OK) {
        if (stmt3)
            sqlite3_finalize(stmt3);
        sqlite3_close(conn);
        return;
    }
    if (sqlite3_step(stmt3) == SQLITE_DONE) {
        printf("The test table has been dropped.\n");
    }
    sqlite3_finalize(stmt3);
    sqlite3_close(conn);
}

int main()
{
    doTest();
    return 0;
}
//输出结果如下:
//Succeed to create test table now.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//Insert Succeed.
//The test table has been dropped.




相关阅读:
php页面缓存方法小结
php实现在服务器端调整图片大小的方法
WinForm项目开发中NPOI用法实例解析
浅谈FileItem类的常用方法
jQuery实现新消息闪烁标题提示的方法
Android开发之BroadcastReceiver用法实例分析
可编辑下拉框的2种实现方式
jQuery EasyUI 入门必看
Asp.net,C# 加密解密字符串的使用详解
SSH网上商城之使用ajax完成用户名是否存在异步校验
win7安装php框架Yii的方法
基于Jquery.history解决ajax的前进后退问题
基于C#实现一个最简单的HTTP服务器实例
win10手机系统预览版10051已修复内容汇总
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 就是这样的我们,世俗不愿接纳的我们。 我和新华字典交朋友 别人援手之际自己也伸出手来 随烟 《登金陵凤凰台》教案2 经典人生短语大全:人生快不快乐看心情,幸不幸福看心态。 教务处工作述职报告 毕业十周年聚会活动方案 美丽的布里斯班植物园500字 在小学毕业典礼上的讲话作文800字 金秋的童话 难忘厦门行700字 男女搞笑幽默短信笑话-碰上女色狼怎么办 有关于清明节踏青的作文 关于难忘的一句话作文600字 风中那不变的承诺 广州高考零分作文 国旗下的演讲作文750字 永生的眼睛读后感200字 矛盾纠纷排查化解汇报 司法行政工作论文 李益《春夜闻笛》 过程作文1000字 鲜花、春风、细雨 又遇网络 2015书法协会上半年计划 县委宣传部学习实践科学发展观活动调研提纲 找到对的人 了、疼你一辈子。找错了人、就等于输了全部 这些疯言疯语,希望大家不要见怪,只当是说了一个笑话,不要当真 我从没想过单身,只是刚好一个人。 寄一张有字的纸给自己 街头的幸福1200字 成长——如歌的行板 第一篇在日记网写的日记 基层信用社年年终工作总结 顶岗实习周期性总结 不哭的·男孩 梦幻四季 解读寿命 乡恋。。。 为谁烟花满地 冒险游戏 关于施工企业加强物资管理的现代化进程研究 生活让我变了样 藏头诗 赠窦小平(外二首) 新年创意祝福语 新年创意祝福短信 终于失去了爱你的勇气 关于如何加强大学生村官管理的调查与思考 我,仍需前行 小学四年级作文晚霞

Copyright © 2016 phpStudy |