天天看點

【原創】modb 功能設計之“支援部分MySQL用戶端協定”-3

 在研究完 mysql 官方文檔上對 connector/c 的說明後,終于可以 開工實踐了,先搞個小 demo 出來運作看看。 

開發環境:windows xp sp3 v11 + vs2010 + mysql connector/c 6.1.2 

測試代碼:

<a href="http://my.oschina.net/moooofly/blog/186246#">?</a>

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

<code>#include &lt;stdio.h&gt;</code>

<code>#include "mysql.h"</code>

<code>int</code> <code>main()</code>

<code>{</code>

<code>    </code><code>mysql mysql;</code>

<code>    </code><code>mysql_res *res = null;</code>

<code>    </code><code>mysql_row row;</code>

<code>    </code><code>mysql_init( &amp;mysql );</code>

<code>    </code><code>if</code> <code>( null == ( mysql_real_connect( &amp;mysql,</code><code>"172.16.81.111"</code><code>,</code><code>"root"</code><code>,</code><code>"root"</code><code>,</code><code>""</code><code>, 0, null, 0 ) ) )</code>

<code>    </code><code>{</code>

<code>        </code><code>fprintf</code><code>( stderr,</code><code>"%s: %s\n"</code><code>,</code><code>"modb"</code><code>, mysql_error( &amp;mysql ) );</code>

<code>        </code><code>exit</code><code>(1);</code>

<code>    </code><code>}</code>

<code>    </code><code>if</code> <code>( mysql_query( &amp;mysql,</code><code>"show tables"</code> <code>) ) {</code>

<code>        </code><code>fprintf</code><code>( stderr,</code><code>"error: %s\n"</code><code>, mysql_error( &amp;mysql ) );</code>

<code>    </code><code>res = mysql_use_result( &amp;mysql );</code>

<code>    </code><code>printf</code><code>(</code><code>"mysql tables in mysql database:\n"</code><code>);</code>

<code>    </code><code>while</code> <code>( (row = mysql_fetch_row(res)) != null )</code>

<code>        </code><code>fprintf</code><code>( stderr,</code><code>"%s \n"</code><code>, row[0] );</code>

<code>    </code><code>mysql_free_result(res);</code>

<code>    </code><code>mysql_close( &amp;mysql );</code>

<code>    </code><code>getchar</code><code>();</code>

<code>    </code><code>return</code> <code>0;</code>

<code>}</code>

【原創】modb 功能設計之“支援部分MySQL用戶端協定”-3

解決辦法: 

換作業系統;

降低 mysql connector/c 的使用版本。

       其實兩種方式都讓人覺得不爽,不過好在隻是為了在 windows 平台上能夠對編寫的 demo 進行迅速調試,是以使用低版本 mysql connector/c 獲選。 降低版本後,立刻能夠正常與 mysql 進行協定互動了。 

      雖然你可能自以為了解了 mysql 協定,但是還是不一定能寫出正确的協定互動,是以,最簡單的辦法就是參考一些知名的 mysql 用戶端産品,如 navicat for mysql,看看别人是怎麼做互動的。

(...抓包分析過程讀者自己實踐...) 

簡單改寫後,新的測試代碼如下:

36

37

38

39

40

41

<code>    </code><code>if</code> <code>(  mysql_query( &amp;mysql,</code><code>"set names utf8"</code> <code>) )</code>

<code>        </code><code>fprintf</code><code>( stderr,</code><code>"error [set names utf8]: %s\n"</code><code>, mysql_error( &amp;mysql ) );</code>

<code>    </code><code>if</code> <code>( mysql_query( &amp;mysql,</code><code>"show databases"</code> <code>) ) {</code>

上述代碼完成了連接配接、查詢、斷開連接配接的基本操作。 

在上述 demo 成功運作後,又提出了如下問題: 

作為一個主要用于執行 sql 語句的用戶端程式,應該采用長連接配接實作,還是短連接配接實作?哪種更好?

執行一條 sql 語句在用戶端實作中要調用到哪些 api 函數?設定哪些 option ?

應該使用 mysql_use_result 擷取結果還是使用 mysql_store_result 擷取結果?

繼續閱讀