1. 程式人生 > >Mysql++學習(二)------Mysql++簡述

Mysql++學習(二)------Mysql++簡述

Mysql++提供了很多種複雜但強有力的資料庫使用方法,但本質上和其他的資料庫操作API沒太大不同

基本模式:

1.開啟一個連線

2.格式化執行查詢

3.如果成功,遍歷結果集

4.否則,處理錯誤

每一步都對應一個Mysql++類或類集

連線物件

一個連線物件管理一條到Mysql伺服器的連線,你至少需要一個這樣的物件來執行其他操作。因為其他Mysql+物件都間接依賴於一個連線例項,所以,該物件的生命週期必須至少和其他物件一樣長。Mysql支援支援多種客戶端到伺服器的資料連線:TCP/IP,Unix域套接字,Windows命名管道.連線類根據你所傳遞引數確定連線型別,如果你明確知道所要使用的連線型別,可以直接使用介面更簡單的子類。

查詢物件

通常情況下,你使用一個被連線物件建立的查詢物件來建立SQL查詢

查詢物件的運用類似一個標準C++輸出流,因此你可以像std::cout或者std::ostringstream一樣寫資料。這是Mysql++提供的構建查詢串的最有C++特徵的方式,庫提供了型別敏感的流操作符,因此,很容易構建動態-正確的SQL語句。

查詢物件也提供類似C的printf()函式的模版查詢:建立一個包含變數的修正串,如果你的查詢結構類似,你就可以建立一個模版查詢。

第三種方式是使用SSQLS,這種特性可以讓你建立C++結構來設立你的資料模式。可以在給定SSQLS模式資料的情況下INSERT,REPLACE, UPDATE表中行,也可以產生SELECT * FROM SomeTable的查詢並且將結果儲存到一個SSQLSes的STL中。

結果集

結果集合中的欄位資料被儲存為一種特殊的類似std::string的類:String。該類有些基本操作,支援到任意C基礎型別轉換,Mysql++還定義了可以用來初始化Mysql DATETIME串的類:DateTime。這些自動的轉換操作會通過警告或者異常來防止轉換的濫用。

不返回資料的查詢

不是所有SQL查詢都會返回資料,CREATE TABLE就不會。對於這種型別的查詢,有一個特殊的型別(SimpleResult)會報告返回狀態:成功有否,有多少行被改變

返回資料的查詢:MySql++資料結構

最直接的取回結果集的方法就是使用Query()::store().它會返回一個StoreQueryResul物件,該物件繼承自std::vector<mysqlpp::Row>,提供對Rows容器的隨機訪問,每一個Row物件都是一個類似std::vector<String>的物件,每個對應結果集中的一個欄位。可以將StoreQueryResult看作是一個二維陣列:通過result[1][4]獲取第二行第5個欄位。也可以通過行和欄位名訪問:result[1]["price"].

一個不太直接的獲取查詢結果集的方式是使用Query::use(),它將返回一個UseQueryResult物件。該類像STL輸出迭代器一樣工作,只能提供順序訪問,不能搜尋,訪問結束前總數未知,但它的記憶體更高效,適合返回大的結果集

返回資料的查詢:專用 SQL結構

通過MySql++的資料結構訪問查詢的返結果是一種比較低層次的抽象,只是比使用MySql的C API稍微好點,SSQLS提供一種更接近問題本身的特性.它允許你定義C++結構來對應你資料庫中的表結構,並且SSQLSes提供普通STL容器及演算法的使用。

這種方式的優勢在於你的程式碼將會嵌入更少的SQL程式碼,你可以輕易的用C++結構執行一個查詢,並且返回結果,其操作就像任意其他結構一樣。結果可以通過Row物件來訪問,或者你可以讓庫將結果放入任何容器-----順序,關聯容器都可以

vector<stock> v;
query << "SELECT * FROM stock";
query.storein(v);
for (vector<stock>::iterator it = v.begin(); it != v.end(); ++it) {
cout << "Price: " << it->price << endl;
}

如果你不想建立SSQLSes結構來對應表結構,MySql++ 3以上版本支援用Row代替:

vector<mysqlpp::Row> v;
query << "SELECT * FROM stock";
query.storein(v);
for (vector<mysqlpp::Row>::iterator it = v.begin(); it != v.end(); ++it) {
cout << "Price: " << it->at("price") << endl;
}

異常

預設,庫在遇到錯誤時會丟擲異常,你也可以讓它設定錯誤標識位,不過異常會攜帶更多資訊,一條指明錯誤發生的串,幾種異常型別可供你分辨。