zoukankan      html  css  js  c++  java
  • VC++、MFC Sqlite3数据库的使用

    SQLite数据库是一种本地的轻型数据库,在存储一些本地的数据的时候,或者不需要用到Oracle,SQL2008之类的大型数据库的时候,Sqlite的优势就能够得到发挥。程序需要采集数据存储起来,可以使用这个数据库。或者觉得ini文件,txt文件在存储的过程中,数据的组织比较困难可以使用这个数据库。

    同时如果是涉及嵌入式系统,SQLite的便捷性能够得到更好的体现。他将所有的方法都包含在了三个文件中:

    sqlite3.h

    sqlite3.c

    sqlite3ext.h

    附下载地址:链接:http://pan.baidu.com/s/1qYawfFY 密码:l7fq

    地址失效可以私信。

    在使用的过程中,最简单的办法是,你可以直接将三个文件全部添加到相应的工程中,在引用头文件之后,你就可以使用其中的方法了。

    其中的增删改查可以参考如下代码使用:但是要注意自己应该添加和完善一些功能

    sqlite3 *db=NULL;
    
        char *zErrMsg = 0;
    
        int rc;
        //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
        rc = sqlite3_open("zsl.db", &db);
    
        if( rc )
    
        {
            CString temp1;
            temp1.Format(_T("Can’t open database: %s
    "), sqlite3_errmsg(db));
            TRACE(temp1);
            //fprintf(stderr, "Can’t open database: %s
    ", sqlite3_errmsg(db));
    
            sqlite3_close(db);
    
            return (1);
    
        }
    
        else
    
            TRACE("You have opened a sqlite3 database named zsl.db successfully!
    ");
    
    
    
        //创建一个表,如果该表存在,则不创建,
    
        //并给出提示信息,存储在zErrMsg 中
    
        char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);" ;
    
        sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
    
    
    
        //插入数据
    
        sql = "INSERT INTO "test" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
    
        sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
    
        int nrow = 0, ncolumn = 0; //查询结果集的行数、列数
    
        char **azResult; //二维数组存放结果
    
    
    
        //查询数据
    
        sql = "SELECT * FROM test ";
    
        sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
    
        int i = 0 ;
    
        printf( "row:%d column=%d 
    " , nrow , ncolumn );
    
        printf( "
    The result of querying is : 
    " );
    
        for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
    
            printf( "azResult[%d] = %s
    ", i , azResult[i] );
    
    
    
        //删除数据
    
        sql = "DELETE FROM test WHERE AGE = 1 ;" ;
    
        sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
    
        //释放掉azResult 的内存空间
    
        sqlite3_free_table( azResult );
    
        sqlite3_close(db); //关闭数据库
    
        int c=getchar();
        return 0;
    }

    值得注意的地方,在于在使用sqlite3 的时候,你会发现存储的过程中会出现中文的乱码,那是因为,SQLite3数据库默认的编码格式为UTF-8,所以在使用之前,需要对你的格式进行转换。

    以VC++ MFC为例,如果你的程序使用的是默认Unicode编码,那么只需要Unicode->UTF-8的转换,如果你是使用的多字节字符集,那么系统默认的编码格式应该是Ansi,这时候,你需要将编码从Ansi转换到Unicode,然后从Unicode转换到UTF-8。

    因为我的工程中使用的多字节,所以我这里先贴出一个Ansi转换为UTF-8的代码:

    //Ansi To Utf-8 Utf-8 To Ansi
    char* *****::AnsiToUtf8(char* stransi)
    {
        //Ansi to Unicode
        int wcsLen = ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),NULL,0);
        wchar_t* strunicode = new wchar_t[wcsLen+1];
        ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),strunicode,wcsLen);
        strunicode[wcsLen] = '';
        //Unicode To UTF-8
        int utf8len = ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
        char* strutf8 = new char[utf8len+1];
        ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),strutf8,utf8len,NULL,NULL);
        strutf8[utf8len] = '';
        
        delete [] strunicode;
        strunicode = NULL;
        return strutf8;
    
    }
    char* ***::Utf8ToAnsi(char* strutf8)
    {
        //UTF-8 To Unicode
        
        int wlen = ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),NULL,0);
        wchar_t* strunicode = new wchar_t[wlen+1];
        ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),strunicode,wlen);
        strunicode[wlen] = '';
        
        //Unicode To Ansi
        int    ansilen = ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
        char* szAnsi = new char[ansilen+1];
        ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),szAnsi,ansilen,NULL,NULL);
        szAnsi[ansilen] = '';
        delete [] strunicode;
        strunicode = NULL;
        return szAnsi;
    }

    注意这段代码中,使用了2个new,但是只delete了一个,这里需要你在使用完成转换后的字符串,进行手动delete,否则可能造成内存泄漏。。

    转换完成之后的显示,中文就不是乱码。

    最后附上一个工具,用来查看sqlite的数据库的内容,但是因为我的电脑上的安装包没有了,所以这里只留下一个名字好了,等到之后有机会再补上链接。

    名字:Navicat premium 以及他的补丁

    图标是这样的:

    打开之后就可以查看你创建的SQLite数据库的文件,很方便可以检查你代码的正确或者错误

    连接补完计划:

    链接:http://pan.baidu.com/s/1pKELaSb 密码:icay

    失效私信我,或者邮箱452875117@qq.com

  • 相关阅读:
    酒里放茶,醉,未遂。
    利用自定义事件实现不同窗体间的通讯 Delphi篇
    主题:CS0016: 未能写入输出文件“c:&#92;WINDOWS&#92;Microsoft.NET&#92;***.dll”错误处理
    delphi點擊窗體最小化,關閉按鈕時的托盤圖標設置
    delphi制作程序啟動歡迎窗體
    那年 那雪
    DOL魔盘解决方案
    专家解密“艳照门”背后三大安全陷阱
    jQuery获取Select选择的Text和 Value(转)
    技术列传 guava cache
  • 原文地址:https://www.cnblogs.com/fudong071234/p/6424856.html
Copyright © 2011-2022 走看看