1. 程式人生 > >Mysql++學習(四)------模板查詢

Mysql++學習(四)------模板查詢

MySQL++提供的另外一個強大的功能就是模板查詢,它提供像c語言中printf類似的機制:你提供給MySQL++一個包含固定串和變數佔位符的查詢字串,之後可以替換這些佔位符的變數.

下面例子顯示瞭如何使用這一特性

#include <iostream>
#include <mysql++.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main()
{
    mysqlpp::Connection conn(false);
    //connect to the database
    if(conn.connect("mysql_cpp_data", "127.0.0.1", "comoon", ""))
    {
        //build a template query
        mysqlpp::Query query = conn.query("select * from stock where item = %0q");
        query.parse();
        //get query result in a storeResult
        mysqlpp::StoreQueryResult res = query.store("Hotdog Buns");
        if(res)
        {
            cout << res[0]["item"] << endl;
            cout << res[0]["num"] << endl;
            cout << res[0]["price"] << endl;
        }
        else
        {
            perror("Failed to get data!");
            exit(EXIT_FAILURE);
        }
        query.reset();    //reset previous template query data
        query << "update stock set item = %0q where item = %1q";
        query.parse();
        mysqlpp::SimpleResult res1 = query.execute("abc", "Hotdog Buns");
    }
    else
    {
        perror("Connect Failed");
        exit(EXIT_FAILURE);
    }
    return 0;
}

query.parse()之前的程式碼用於設定模板,parse()呼叫用於使其生效,自生效開始,你可以通過呼叫查詢的多個函式來多次使用這個模板

建立一個模板查詢

建立一個模板查詢,首先你得把內容插入到查詢物件中,用數字來表示要替換的佔位符,然後呼叫parse() 函式,告訴查詢物件,這是一個查詢模板,需要被解析

query << "select (%2:field1, %3:field2) from stock where %1:wheref = %0q:what";

query.parse();

佔位符的形式為:

%###(modifier)(:name)(:)

“###” 為最大三位的數字,表示給SQLQueryParms物件的引數序列,從0開始

modifier可以是下面任意一個:

%列印一個實際的“%”符號

“”不管什麼,都不要引號或者忽略

q將被用單引號括起來,不被作為關鍵字解釋

Q將被用引號括起來,不過不會避免關鍵字檢測

設定引數

在查詢的時候,你需要指定引數.“parm0”對應於第一個引數,依次類推.

例如:

StoreQueryResult res = query.store("Dinner Rolls", "item", "item", "price")

上面的查詢將會被解析為:

select (item, price) from stock where item = "Dinner Rolls"

預設引數

模板查詢機制,允許你設定預設引數.你只需要給Query::template_defaultsarray對應元素賦值就可以了

query.template_defaults[1] = "item";

query.template_defaults["wheref"] = "item";

這種預設引數機制類似C++的函式預設引數.