• sqlite学习笔记7:C语言中使用sqlite之打开数据库


    数据库的基本内容前面都已经说得差点儿相同了。接下看看如何在C语言中使用sqlite。

    一 接口

    sqlite3_open(const char *filename, sqlite3 **ppDb)

    打开数据库,假设数据库不存在则新建一个数据库,并打开


    sqlite3_close(sqlite3*)

    关闭数据库。假设关闭之前还存在没有运行完的语句,将会返回SQLITE_BUSY


    二 实例

    1 文件夹结构

    Projects{

    main.c// 代码所在文件

           sqlite{// 官网下载下来的sqlite压缩包解压之后的文件文件夹

           shell.c// 本文件在项目中实际上是用不上的。这个文件是用来生成sqlite命令工具的,详细能够參考:sqlite学习笔记1

    sqlite3.c

    sqlite3.h

    sqlite3ext.h

    }

    }


    2 源码

    // main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite/sqlite3.h"
    
    #define DB_NAME "hanfeng.db"
    
    int main()
    {
        sqlite3* db = NULL ;
        char* msg = NULL ;
        int ret = 0 ;
        
        ret = sqlite3_open(DB_NAME, &db);
        if (ret){
            fprintf(stderr, "error open datebase:%s
    .", DB_NAME) ;
            exit(0) ;
        }
        else{
            fprintf(stdout, "successfully open datebase.
    ") ;
        }
        sqlite3_close(db) ;
        return 0;
    }


    为了今后扩展方便,现将代码改动例如以下:

    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite/sqlite3.h"
    
    #define DB_NANE "sqlite/test.db"
    
    sqlite3 *db = NULL;
    char* sql = NULL;
    char *zErrMsg = NULL;
    int ret = 0;
    
    typedef enum{
        false,
        true
    } bool;
    
    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
        int i = 0;
        for(i=0; i < argc; i++){
            printf("%s = %s
    ", azColName[i], argv[i] ? argv[i] : "NULL");
        }
        printf("
    ");
        
        return 0;
    }
    
    bool connectDB()
    {
        ret = sqlite3_open(DB_NANE, &db);
        
        if( ret != SQLITE_OK){
            fprintf(stderr, "Error open database: %s
    ", sqlite3_errmsg(db));
            sqlite3_free(zErrMsg);
            
            return false;
        }
        
        fprintf(stdout, "Successfully opened database
    ");
        return true;
    }
    
    bool closeDB()
    {
        int ret = 0;
        ret = sqlite3_close(db);
        if ( ret == SQLITE_BUSY ){
            return false;
        }
        
        return true;
    }
    
    int main(int argc, char* argv[])
    {
        connectDB();
        closeDB();
        
        return 0;
    }



    3 编译执行

    执行有两种方式,基于前面的笔记。我们并没有配置sqlite的环境。不过下载解压得到列一个目录sqlite,因此。须要用例如以下命令:

    gcc -o main main.c ./sqlite/sqlite3.c -lpthread -ldl

    假设下载配置安装了sqlite,则须要将上面的头文件包括改为:

    #include <sqlite3.h>

    然后运行命令:

    gcc -o main main.c  -lsqlite3


    命令运行完毕之后会生成一个叫main的可运行文件,输入:

    ./main

    既能够看到结果。


    #在编译时使用g++会报错: error: invalid conversion from ‘const void*’ to ‘const char*’

    g++貌似对类型转换要求更为严格,不支持这种转换。

    路过的大侠,知道如何用g++编译的,请不吝赐教......

  • 相关阅读:
    2021年gitbook的安装报错,一次解决方案!
    配置docker看我一篇就够了----Windows10上Hyper-V 或者 WSL2配置Docker+Vscode完整配置
    React.JS详细分析token存储以及提取的方法,其中涉及技术(localStorage、react-cookies、immutable、JSON)
    GO语言: 双单链表、队列、进出栈打造一个简易的数据结构库 以及测试你的程序是否存在BUG!
    Redis管道操作
    Jedis连接池操作
    java连接Redis存储对象或值,用byte[]、String两种方式
    template标签配合vue用法
    linux系统中ssh免密登录
    linux系统scp、rsync拷贝操作命令使用
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6898926.html
Copyright © 2020-2023  润新知