SQLite資料操作

來源:互聯網
上載者:User

標籤:

SQLite,是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,SQLite引擎不是個程式與之通訊的獨立進程,而是串連到程式中成為它的一個主要部分,其主要的通訊協定是在程式設計語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有著積極的作用。
1.Qt操作SQLite資料庫
Qt提供了與平台以及資料庫種類無關的訪問資料庫介面,支援類型和描述分別有:
Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server
涉及操作注意點:
<1>.建立Qt項目,資料庫放置與工程同一個目錄下,添加標頭檔【include <QtSql>】,Qt工程檔案(xxx.pro)添加涉及庫【QT +=sql】;
<2>.SQLite資料庫主要操作
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //聲明資料庫類型
db.setDatabaseName("demo.db"); //關聯資料庫
db.open(); //串連開啟資料庫【只有通過open啟用到資料庫的物理串連,否則不可用】
QSqlQuery sqlQuery(db); //資料庫操作
sqlQuery.exec("select * from 資料表"); //通過exec執行sql相關操作
db.close(); //用完,關閉資料庫
<3>.簡單例子
#include <QtCore/QCoreApplication>
#include <QtSql>
#include <qDebug>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName((char *)"demo.db");
    //db.setUserName("使用者名稱");
    //db.setPassword("密碼");
    if(!db.open())
    {
        //串連資料庫失敗
        return -1;
    }

    QSqlQuery sqlQuery;
    //插入資料
    sqlQuery.prepare("insert into employee(id, name, salary) values(:id, :name, :salary)");
    bool bInsert = sqlQuery.exec("insert into employee(id, name, salary) values(1001, ‘張三‘, 6500)";
    //sqlQuery.bindValue(":id", 1001);
    //sqlQuery.bindValue(":name", "張三");
    //sqlQuery.bindValue(":salary", "6500");
    //bool bInsert = sqlQuery.exec();
    if (!bInsert)
    {
        //插入資料失敗
    }

    //查詢資料
    sqlQuery.exec("select * from employee");
    while (sqlQuery.next())
    {
        int id = sqlQuery.value(0).toInt();
        QString name = sqlQuery.value(1).toString();
        QString salary = sqlQuery.value(2).toString();
        //擷取相關資料處理
    }

    //更新資料
    sqlQuery.exec("update employee set salary= \"7000\" where id=\"1001\"");

    app.exec();
    return 0;
}

2.C/C++介面操作SQLite資料庫
SQLite本身提供了對應的API函數介面供C/C++程式調用,主要有:sqlite3_open(),sqlite3_exec()和sqlite3_close()。
<1>.核心對象
SQLite中主要的核心對象分別為:database_connection和prepared_statement
database_connection對象是由sqlite3_open()介面函數建立並返回的,在應用程式使用任何其他SQLite介面函數之前,必須先調用該函數以便獲得database_connnection對象,在隨後的其他調用中,都需要該對象作為輸入參數以完成相應的工作;
prepare_statement可以把它視為編譯後的SQL語句,作為涉及操作調用介面參數;

<2>.核心介面
sqlite3_open是操作SQLite資料庫的入口函數,該函數返回database_connection對象,作為控制代碼參數供其他介面調用;

sqlite3_prepare將相關的SQL語句轉換為prepared_statement對象,並在函數執行後返回對象指標,相當於一種操作初始化準備;

sqlite3_step用於評估sqlite3_prepare函數返回的prepared_statement對象,執行完將對象內部指標指向結果的資料行首,對於insert/update/delete等dml語句,該函數只需執行一次,其他需要訪問其他資料行,需重複調用;

sqlite3_column擷取當前行指定列的資料,由相關的介面完成該功能:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
其中sqlite3_column_count函數用於擷取當前結果集中的欄位資料;

sqlite3_finalize用於銷毀prepared statement對象,避免記憶體泄露;

sqlite3_close用於關閉之前開啟的database_connection對象;

<3>.簡單例子
#include <stdio.h>
#include <sqlite3.h>
int main()
{
    int iRet;
    sqlite3 *db=NULL;
    iRet = sqlite3_open("demo.db", &db)
    if (SQLITE_OK != iRet)
    {
        //開啟資料庫失敗
        return -1;
    }

    char *ErrMsg;
    //sqlite3_exec:參數1(資料庫指標)/參數2(sql語句)/參數3(回呼函數)/參數4(回呼函數參數)/參數5(返回錯誤資訊)
    iRet = sqlite3_exec(db, "insert into employee(id, name, salary) values(1001,\"張三\",\"6500\")", NULL, NULL, &ErrMsg);
    if (SQLITE_OK != iRet)
    {
        //插入資料失敗
    }

    //int sqlite3_prepare(
    // sqlite3 *db,                        /* Database handle */
    // const char *zSql,                /* SQL statement, UTF-8 encoded */
    // int nByte,                          /* Maximum length of zSql in bytes. */
    // sqlite3_stmt **ppStmt,      /* OUT: Statement handle */
    // const char **pzTail             /* OUT: Pointer to unused portion of zSql */
    // );
    sqlite3_stmt *ppStmt;
    iRet = sqlite3_prepare(db,"select id,name,salary from employee", -1, &ppStmt, NULL);
    if (SQLITE_OK != iRet)
    {
        //讀取資料失敗
    }
    else
    {
        while(sqlite3_step(ppStmt) == SQLITE_ROW)
        {
            printf("id: %s\t", sqlite3_column_text(ppStmt, 0));
            printf("name: %s\t", sqlite3_column_text(ppStmt, 1));
            printf("salary: %s\n", sqlite3_column_text(ppStmt, 2));
        }
        sqlite3_finalize(ppStmt);
    }

    sqlite3_close(db);
    return 0;
}

SQLite資料操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.