Linux C++操作mysql入門
一、初識與mysql相關的部分資料型別和api
1.1) MYSQL:該結構代表一個數據庫的連線控制代碼,一般我們都不去複製它
MYSQL_RES:查詢返回的結果集
MYSQL_ROW:一行資料的表示,通過呼叫mysql_fetch_row()獲得的。
MYSQL_FIELD:該結構包含欄位資訊,如欄位名、型別和大小等。欄位指不包含在這一結構中,其值位於MYSQL_ROW結構中。
1.2) 部分api
1)
MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化與mysql_real_connect()相適應的MYSQL物件。如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,當呼叫mysql_close()來關閉連線時。將釋放該物件。
返回值
初始化的MYSQL*控制代碼。如果無足夠記憶體以分配新的物件,返回NULL。
2)
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
描述
與執行在主機上的mysql資料庫建立連線。必須在mysql_init呼叫成功之後才可以呼叫該函式。
引數解析:
mysql:mysql_init成功返回的控制代碼
host:主機名或者ip地址,該引數為NULL或者"localhost"表示本機。
user:db使用者名稱
passwd:db密碼
db:要訪問的db名字,如果db為NULL,連線會將預設的資料庫設為該值
port:若“port”不是0,其值將用作TCP/IP連線的埠號。注意,“host”引數決定了連線的型別。
client_flag:通常為0
unix_socket: 可以取NULL,該字串描述了應使用的套接字或命名管道
3)
int mysql_query(MYSQL *mysql, const char *q)
描述
執行由“Null終結的字串”查詢指向的SQL查詢。正常情況下,字串必須包含1條SQL語句,而且不應為語句新增終結分號(‘;’)或“\g”。如果允許多語句執行,字串可包含多條由分號隔開的語句,引數q為sql語句。返回值,0-成功,非0-失敗。
4)
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
描述
執行由“query”指向的SQL查詢,它應是字串長度位元組“long”。對於包含二進位制資料的查詢,必須使用mysql_real_query()而不是mysql_query(),這是因為,二進位制資料可能會包含‘\0’字元。此外,mysql_real_query()比mysql_query()快,這是因為它不會在查詢字串上呼叫strlen()。
5)
MYSQL_RES *mysql_store_result(MYSQL *mysql)
描述
對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),呼叫mysql_store_result()獲取結果集,如果查詢未返回結果集或讀取失敗,mysql_store_result()將返回Null指標。
6)
my_ulonglong mysql_affected_rows(MYSQL *mysql)
描述
返回受影響的行數
7)
unsigned int mysql_field_count(MYSQL *mysql)
描述
返回作用在連線上的最近查詢的列數。
8)
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
描述
對於結果集,返回所有MYSQL_FIELD結構的陣列。每個結構提供了結果集中1列的欄位定義。
返回值
關於結果集所有列的MYSQL_FIELD結構的陣列。
9)
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述
檢索結果集的下一行。在mysql_store_result()之後使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL。
行內值的數目由mysql_num_fields(result)給出。如果行中儲存了呼叫mysql_fetch_row()返回的值,將按照row[0]到row[mysql_num_fields(result)-1],訪問這些值的指標。行中的NULL值由NULL指標指明。
可以通過呼叫mysql_fetch_lengths()來獲得行中欄位值的長度。對於空欄位以及包含NULL的欄位,長度為0。通過檢查欄位值的指標,能夠區分它們。
返回值
下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL。
10)
unsigned int mysql_num_fields(MYSQL_RES *result)
要想傳遞MYSQL*參量取而代之,請使用無符號整數mysql_field_count(MYSQL *mysql)。
描述
返回結果集中的列數。
注意,你可以從指向結果集的指標或指向連線控制代碼的指標獲得列數。如果mysql_store_result()或mysql_use_result()返回NULL,應使用連線控制代碼(因而沒有結果集指標)。在該情況下,可呼叫mysql_field_count()來判斷mysql_store_result()是否生成了非空結果。這樣,客戶端程式就能採取恰當的行動,而不需要知道查詢是否是SELECT語句(或類似SELECT的語句)。
沒有實際的程式碼,終歸是紙上談兵,也不能加深我們的理解,下邊請看程式碼例項。
// ------------------databasemysql.h
#ifndef DATABASEMYSQL
#define DATABASEMYSQL
#include <mysql/mysql.h>
#include <string>
using std::string;
class DataseMysql
{
public:
struct DatabaseInfo
{
string strHost;
string strUser;
string strPwd;
string strDBName;
};
public:
DataseMysql();
~DataseMysql();
bool Init(MYSQL* mysql, const string& host, const string& user, const string& passwd, const string& database);
bool QuerySql(const char* sql);
private:
// 控制代碼
MYSQL * m_pMysql;
// 結果集
MYSQL_RES* m_pMysqlRes;
// 行
MYSQL_ROW m_row;
// field
MYSQL_FIELD * m_pMysqlField;
bool m_bInit;
};
#endif // DATABASEMYSQL
// ------------------databasemysql.cpp
#include "databasemysql.h"
#include <iostream>
#include <string.h>
using namespace std;
DataseMysql::DataseMysql(void)
{
m_bInit = false;
m_pMysql = NULL;
m_pMysqlRes = NULL;
m_pMysqlField = NULL;
}
DataseMysql::~DataseMysql(void)
{
if (m_pMysql != NULL)
{
if (m_bInit)
{
mysql_close(m_pMysql);
}
}
}
bool DataseMysql::Init(MYSQL *mysql, const string &host, const string &user, const string &passwd, const string &database)
{
if (m_bInit)
{
mysql_close(m_pMysql);
}
m_pMysql = mysql_init(mysql);
if (!m_pMysql)
{
cout << "mysql init failed." << endl;
return false;
}
MYSQL* pMysql = NULL;
pMysql = mysql_real_connect(m_pMysql, host.c_str(), user.c_str(), passwd.c_str(), database.c_str(), 0, NULL, 0);
if (pMysql == m_pMysql)
{
cout << "connect succeed." << endl;
mysql_query(pMysql, "set names utf8");
return true;
}
else
{
cout << "failed: " << ", error: " << mysql_error(m_pMysql) << endl;
return false;
}
}
bool DataseMysql::QuerySql(const char *sql)
{
int ret = 0;
int len = strlen(sql);
ret = mysql_real_query(m_pMysql, sql, len);
if (ret)
{
cout << "DataseMysql::QuerySql failed." << endl;
return false;
}
m_pMysqlRes = mysql_store_result(m_pMysql);
if (!m_pMysqlRes)
{
cout << "m_pMysqlRes is null." << endl;
return false;
}
my_ulonglong rowCount = 0;
unsigned int fieldCount = 0;
rowCount = mysql_affected_rows(m_pMysql);
fieldCount = mysql_field_count(m_pMysql);
// 遍歷結果集裡的情況.
m_row = mysql_fetch_row(m_pMysqlRes);
while (m_row)
{
for (int i = 0; i < fieldCount; ++i)
{
cout << m_row[i] << "\t\t";
}
cout << endl;
m_row = mysql_fetch_row(m_pMysqlRes);
}
mysql_free_result(m_pMysqlRes);
}
// ------------------main.cpp
#include <iostream>
#include "databasemysql.h"
using namespace std;
int main()
{
DataseMysql mysqlObj;
if (!mysqlObj.Init(NULL, "localhost", "root", "root", "test"))
{
return -1;
}
//mysqlObj.QuerySql("select * from test");
mysqlObj.QuerySql("show databases");
cout << "Hello World!" << endl;
return 0;
}
# ------------------CMakeLists.txt
project(testMysql)
cmake_minimum_required(VERSION 2.8)
#set(CMAKE_BUILD_TYPE DEBUG)
find_library(MYSQL_LIB libmysqlclient.so /usr/lib/)
if (NOT MYSQL_LIB)
message(FATAL_ERROR "mysqlclient not found")
else (MYSQL_LIB)
message("find")
endif(NOT MYSQL_LIB)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} mysqlclient)
輸出結果如下:
connect succeed.
information_schema
myim
mysql
performance_schema
sanilblog
sys
test
Hello World!
這就是初識Linux c++呼叫mysql,由於時間關係,暫時這樣了,後續有時間再進行完善。