【原創】modb功能設計之“支援部分MySQL客戶端協議”-3
在研究完 MySQL 官方文件上對 Connector/C 的說明後,終於可以 開工實踐了,先搞個小 demo 出來執行看看。
開發環境:Windows XP SP3 v11 + VS2010 + MySQL Connector/C 6.1.2
測試程式碼:
開發環境:Windows XP SP3 v11 + VS2010 + MySQL Connector/C 6.1.2
測試程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <stdio.h> #include "mysql.h" int main()
{ MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
mysql_init( &mysql );
if ( NULL == ( mysql_real_connect( &mysql, "172.16.81.111" , "root" , "root" , "" , 0, NULL, 0 ) ) )
{
fprintf ( stderr, "%s: %s , "MoDb" , mysql_error( &mysql ) );
exit (1);
}
if ( mysql_query( &mysql, "show tables" ) ) {
fprintf ( stderr, "Error: %s , mysql_error( &mysql ) );
exit (1);
}
res = mysql_use_result( &mysql );
printf ( "MySQL Tables in mysql database: );
while ( (row = mysql_fetch_row(res)) != NULL )
{
fprintf ( stderr, "%s , row[0] );
}
mysql_free_result(res);
mysql_close( &mysql );
getchar ();
return 0;
} |
工程配置好後,執行出現“無法定位程式輸入點 InitializeConditionVariable 於動態連結庫 KERNEL32.dll 上。”的錯誤。哈哈,知道為啥不(其實上一篇文章已經說明了這個問題)?我一下就想到了,但還是在度娘那邊問查了一下,給出的答案五花八門,相關的不多。其實就是因為 XP 上的 KERNEL32.dll 不支援 InitializeConditionVariable 的緣故。
解決辦法:
- 換作業系統;
- 降低 MySQL Connector/C 的使用版本。
其實兩種方式都讓人覺得不爽,不過好在只是為了在 Windows 平臺上能夠對編寫的 demo 進行迅速除錯,所以使用低版本 MySQL Connector/C 獲選。 降低版本後,立刻能夠正常與 MySQL 進行協議互動了。
雖然你可能自以為理解了 MySQL 協議,但是還是不一定能寫出正確的協議互動,所以,最簡單的辦法就是參考一些知名的 MySQL 客戶端產品,如 Navicat for MySQL,看看別人是怎麼做互動的。
(…抓包分析過程讀者自己實踐…)
簡單改寫後,新的測試程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <stdio.h> #include "mysql.h" int main()
{ MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
mysql_init( &mysql );
if ( NULL == ( mysql_real_connect( &mysql, "172.16.81.111" , "root" , "root" , "" , 0, NULL, 0 ) ) )
{
fprintf ( stderr, "%s: %s , "MoDb" , mysql_error( &mysql ) );
exit (1);
}
if ( mysql_query( &mysql, "SET NAMES utf8" ) )
{
fprintf ( stderr, "Error [SET NAMES utf8]: %s , mysql_error( &mysql ) );
exit (1);
}
if ( mysql_query( &mysql, "show databases" ) ) {
fprintf ( stderr, "Error: %s , mysql_error( &mysql ) );
exit (1);
}
res = mysql_use_result( &mysql );
printf ( "MySQL Tables in mysql database: );
while ( (row = mysql_fetch_row(res)) != NULL )
{
fprintf ( stderr, "%s , row[0] );
}
mysql_free_result(res);
mysql_close( &mysql );
getchar ();
return 0;
} |
上述程式碼完成了連線、查詢、斷開連線的基本操作。
在上述 demo 成功執行後,又提出瞭如下問題:
- 作為一個主要用於執行 sql 語句的客戶端程式,應該採用長連線實現,還是短連線實現?哪種更好?
- 執行一條 sql 語句在客戶端實現中要呼叫到哪些 API 函式?設定哪些 option ?
- 應該使用 mysql_use_result 獲取結果還是使用 mysql_store_result 獲取結果?
相關文章
- 【轉載】MySQL客戶端伺服器協議MySql客戶端伺服器協議
- ICAP: 互換客戶端地址協議客戶端協議
- ntp協議及客戶端開發協議客戶端
- (原創)IP協議Header部分的Checksum計算方法協議Header
- 21_MQTT協議_客戶端和服務端MQQT協議客戶端服務端
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- 修改CAS客戶端 使用簡單HTTP協議客戶端HTTP協議
- MQTT協議從服務端到客戶端詳解MQQT協議服務端客戶端
- 從PHP客戶端看MongoDB通訊協議TDPHP客戶端MongoDB協議
- 實現一個clickhouse tcp協議客戶端驅動TCP協議客戶端
- Shimo mac(多協議VPN客戶端工具)5.0.4啟用Mac協議客戶端
- 多協議VPN客戶端工具:Shimo for mac破解版協議客戶端Mac
- IM客戶端Socks 5代理協議應用客戶端協議
- gRPC之.Net6中的客戶端和服務端共用proto協議檔案RPC客戶端服務端協議
- Winform客戶端引用WCF客戶端後,部分類無法正常使用ORM客戶端
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- 【原創】基於MySQLConnector/C實現客戶端程式之API總結MySql客戶端API
- Apollo 4 客戶端 SDK 設計客戶端
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- MySQL 客戶端安裝MySql客戶端
- Java OAuth 2.0 客戶端程式設計(二): 客戶端憑據授權JavaOAuth客戶端程式設計
- Python模組學習:httplib HTTP協議客戶端實現PythonHTTP協議客戶端
- 「美餐客戶端 3.0」設計過程客戶端
- 客戶端Cookie中文程式設計 (轉)客戶端Cookie程式設計
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- [絕對原創] AKM專案逸事之客戶投訴
- jQuery實現客戶端CheckAll功能jQuery客戶端
- 使用java語言基於SMTP協議手寫郵件客戶端Java協議客戶端
- gmail客戶端設定AI客戶端
- linux之客戶端連線數統計Linux客戶端
- 【zookeeper之七】Zookeeper客戶端客戶端
- HTTP客戶端框架之RetrofitHTTP客戶端框架
- 多協議VPN客戶端軟體:Shimo for mac v5.0.4啟用版協議客戶端Mac
- 強大的多協議VPN客戶端工具Shimo 啟用最新版協議客戶端
- Shimo for mac直裝版 多協議VPN客戶端 完美相容 M1Mac協議客戶端
- 介面自動化測試:Thrift框架RPC協議客戶端開發框架RPC協議客戶端
- mysql、redis 客戶端連線池MySqlRedis客戶端
- 命令列客戶端MySQL如何使用命令列客戶端MySql