本文目錄一覽:
- 1、如何在vs2010中添加mysql 5.1數據庫 api方法
- 2、MySQL C API怎麼實現數據庫表的插入數據
- 3、如何提高mysql的api的訪問性能
- 4、mysql的C API編程
- 5、VC 用MySQL API 連接數據庫,如何返回查詢的總數?
如何在vs2010中添加mysql 5.1數據庫 api方法
通過MySQL自定義的API函數進行連接
1、使用API的方式連接,需要加載mysql的頭文件和lib文件。
在VS2010的附加包含目錄中添加\MySQL\MySQL Server 5.1\include。在安裝MySql的目錄下找。 把libmysql.dll和libmysql.lib文件拷貝到所建的工程目錄下。然後在頭文件里包含以下內容:
//mysql所需的頭文件和庫文件
#include “winsock.h”
#include “mysql.h”
#pragma comment(lib,”libmySQL.lib”)
2、進行編碼
(1)連接mysql數據庫
頭文件里定義數據源指針 MYSQL m_sqlCon;
//連接MySql數據庫
try
{
mysql_init(m_sqlCon);
// localhost:服務器 root為賬號密碼 test為數據庫名 3306為端口
if(!mysql_real_connect(m_sqlCon, “localhost”,”root”,”root”,”test”,3306,NULL,0))
{
AfxMessageBox(_T(“數據庫連接失敗!”));
return FALSE;
}
return TRUE;
}
catch (…)
{
return FALSE;
}
(2)關閉數據庫
mysql_close(m_sqlCon);
(3)創建表
char* pQuery = “create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))”
if(mysql_real_query(m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)
{
const char* pCh = mysql_error(m_sqlCon);
return FALSE;
}
附MySQL的API接口:
mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
mysql_close() 關閉一個服務器連接。
mysql_connect() 連接一個MySQL服務器。該函數不推薦;使用mysql_real_connect()代替。
mysql_change_user() 改變在一個打開的連接上的用戶和數據庫。
mysql_create_db() 創建一個數據庫。該函數不推薦;而使用SQL命令CREATE DATABASE。
mysql_data_seek() 在一個查詢結果集合中搜尋一任意行。
mysql_debug() 用給定字符串做一個DBUG_PUSH。
mysql_drop_db() 拋棄一個數據庫。該函數不推薦;而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() 讓服務器將調試信息寫入日誌文件。
mysql_eof() 確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() 返回最近被調用的MySQL函數的出錯編號。
mysql_error() 返回最近被調用的MySQL函數的出錯消息。
mysql_escape_string() 用在SQL語句中的字符串的轉義特殊字符。
mysql_fetch_field() 返回下一個表字段的類型。
mysql_fetch_field_direct () 返回一個表字段的類型,給出一個字段編號。
mysql_fetch_fields() 返回一個所有字段結構的數組。
mysql_fetch_lengths() 返回當前行中所有列的長度。
mysql_fetch_row() 從結果集合中取得下一行。
mysql_field_seek() 把列光標放在一個指定的列上。
mysql_field_count() 返回最近查詢的結果列的數量。
mysql_field_tell() 返回用於最後一個mysql_fetch_field()的字段光標的位置。
mysql_free_result() 釋放一個結果集合使用的內存。
mysql_get_client_info() 返回客戶版本信息。
mysql_get_host_info() 返回一個描述連接的字符串。
mysql_get_proto_info() 返回連接使用的協議版本。
mysql_get_server_info() 返回服務器版本號。
mysql_info() 返回關於最近執行得查詢的信息。
mysql_init() 獲得或初始化一個MYSQL結構。
mysql_insert_id() 返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。
mysql_kill() 殺死一個給定的線程。
mysql_list_dbs() 返回匹配一個簡單的正則表達式的數據庫名。
mysql_list_fields() 返回匹配一個簡單的正則表達式的列名。
mysql_list_processes() 返回當前服務器線程的一張表。
mysql_list_tables() 返回匹配一個簡單的正則表達式的表名。
mysql_num_fields() 返回一個結果集合重的列的數量。
mysql_num_rows() 返回一個結果集合中的行的數量。
mysql_options() 設置對mysql_connect()的連接選項。
mysql_ping() 檢查對服務器的連接是否正在工作,必要時重新連接。
mysql_query() 執行指定為一個空結尾的字符串的SQL查詢。
mysql_real_connect() 連接一個MySQL服務器。
mysql_real_query() 執行指定為帶計數的字符串的SQL查詢。
mysql_reload() 告訴服務器重裝授權表。
mysql_row_seek() 搜索在結果集合中的行,使用從mysql_row_tell()返回的值。
mysql_row_tell() 返回行光標位置。
mysql_select_db() 連接一個數據庫。
mysql_shutdown() 關掉數據庫服務器。
mysql_stat() 返回作為字符串的服務器狀態。
mysql_store_result() 檢索一個完整的結果集合給客戶。
mysql_thread_id() 返回當前線程的ID。
mysql_use_result() 初始化一個一行一行地結果集合的檢索。
MySQL C API怎麼實現數據庫表的插入數據
或者綁定變量,官網例子:
MYSQL_TIME ts;
MYSQL_BIND bind[3];
MYSQL_STMT *stmt;
strmov(query, “INSERT INTO test_table(date_field, time_field,
timestamp_field) VALUES(?,?,?”);
stmt = mysql_stmt_init(mysql);
if (!stmt)
{
fprintf(stderr, ” mysql_stmt_init(), out of memory\n”);
exit(0);
}
if (mysql_stmt_prepare(mysql, query, strlen(query)))
{
如何提高mysql的api的訪問性能
MySQL Cluster提供多種方式對存儲數據進行訪問; 最常見的方法當然是SQL,不過正如下圖所示,我們還可以利用多種原生API幫助應用程序直接從數據庫當中讀取及寫入數據,同時又能通過轉換為SQL以繞過MySQL Server的方式防止效率低下或者拉高開發復…
mysql的C API編程
MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客戶端中用來設置讀取超時時間的參數。在 MySQL 的官方文檔中,該參數的描述是這樣的:
MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.
也就是說在需要的時候,實際的超時時間會是設定值的 3 倍。但是實際測試後發現實際的超時時間和設置的超時時間一致。
而具體什麼時候發生三倍超時,在文檔中沒有找到。所以對 MySQL 5.7.20 的源碼進行了一些分析。
使用 GDB 調試代碼找了實際與 mysql server 通信的代碼,如下:
其中 vio_read() 函數中,使用 recv 和 poll 來讀取報文和做讀取超時。net_should_retry() 函數只有在發生 EINTR 時才會返回 true。從這段代碼來看是符合測試結果的,並沒有對讀取進行三次重試。只有在讀取操作被系統中斷打斷時才會重試,但是這個重試並沒有次數限制。
從上面代碼的分析可以看出,代碼的邏輯和文檔的描述不符。於是在一頓搜索後,找到了一個 MySQL 的 BUG(Bug #31163)。該 BUG 報告了在 MySQL 5.0 中,MySQL c api 讀取的實際超時時間是設置的三倍,與現有文檔描述相符。於是對 MySQL 5.0.96 的代碼又進行分析。
同樣使用 GDB 找到了通信部分的代碼。這次找到了重試三次的代碼,如下:
這個版本的 MySQL api 的讀寫超時是直接使用的 setsockopt 設置的。第一次循環,在 A 點發生了第一次超時(雖然注釋寫的非阻塞,但是客戶端的連接始終是阻塞模式的)。然後在 B 點將該 socket 設置為阻塞模式,C 點這裡重置 retry 次數。由於設置了 alarm 第二次以後的循環會直接進入 D 點的這個分支,並且判斷循環次數。作為客戶端時net-retry_count 始終是 1,所以重試了兩次,共計進行了 3 次 vioread 後從 E 點退出函數。
由上面的分析可知,MySQL 文檔對於該參數的描述已經過時,現在的 MYSQL_OPT_READ_TIMEOUT 並不會出現三倍超時的問題。而 Bug #31163 中的處理結果也是將文檔中該參數的描述更新為實際讀取超時時間是設定時間的三倍。也許是 MySQL 的維護者們在後續版本更新時忘記更新文檔吧。
VC 用MySQL API 連接數據庫,如何返回查詢的總數?
好多人做法是,寫兩條條件相同的語句
一條查詢總數一條查詢結果
select
count(*)
from
tab1
where
name
like
‘aaa’;
select
*
from
tab1
where
name
like
‘aaa’
limit
0,10
還有別的辦法嗎?謝謝!
對我有用[0]丟個板磚[0]引用舉報管理TOPrucypli(我要冰糖)等
級:
原創文章,作者:MML3K,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/128023.html