【原创】modb 功能设计之“支持部分MySQL客户端协议”-3

 在研究完 MySQL 官方文档上对 Connector/C 的说明后,终于可以 开工实践了,先搞个小 demo 出来运行看看。 

开发环境: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\n", "MoDb", mysql_error( &mysql ) );

        exit(1);

    }

 

    if ( mysql_query( &mysql, "show tables" ) ) {

        fprintf( stderr, "Error: %s\n", mysql_error( &mysql ) );

        exit(1);

    }

    res = mysql_use_result( &mysql );

 

    printf("MySQL Tables in mysql database:\n");

    while ( (row = mysql_fetch_row(res)) != NULL )

    {

        fprintf( stderr, "%s \n", 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\n", "MoDb", mysql_error( &mysql ) );

        exit(1);

    }

 

    if (  mysql_query( &mysql, "SET NAMES utf8" ) )

    {

        fprintf( stderr, "Error [SET NAMES utf8]: %s\n", mysql_error( &mysql ) );

        exit(1);

    }

 

    if ( mysql_query( &mysql, "show databases" ) ) {

        fprintf( stderr, "Error: %s\n", mysql_error( &mysql ) );

        exit(1);

    }

    res = mysql_use_result( &mysql );

 

    printf("MySQL Tables in mysql database:\n");

    while ( (row = mysql_fetch_row(res)) != NULL )

    {

        fprintf( stderr, "%s \n", row[0] );

    }

 

    mysql_free_result(res);

    mysql_close( &mysql );

 

    getchar();

    return 0;

}

上述代码完成了连接、查询、断开连接的基本操作。 

在上述 demo 成功运行后,又提出了如下问题: 

  • 作为一个主要用于执行 sql 语句的客户端程序,应该采用长连接实现,还是短连接实现?哪种更好?
  • 执行一条 sql 语句在客户端实现中要调用到哪些 API 函数?设置哪些 option ?
  • 应该使用 mysql_use_result 获取结果还是使用 mysql_store_result 获取结果?
时间: 2024-10-01 15:28:40

【原创】modb 功能设计之“支持部分MySQL客户端协议”-3的相关文章

【原创】modb 功能设计之“支持部分MySQL客户端协议”-2

首先看看有哪些资源:1. MySQL 官网 [MySQL Connectors]->[Connector/C (libmysqlclient)] Connector/C (libmysqlclient) is a client library for C development. 官网对 MySQL Connector/C 的完整文档描 述参考 这里 . 重点内容摘录翻译如下 === [22.5. MySQL Connector/C]       MySQL Connector/C 是一个客户端

【原创】modb 功能设计之“支持对sql语句的相关日志记录”

[需求分析] 终于到了处理 sql 日志的阶段了,万里长征重点的关键一步. 需要考虑解决的问题点如下:  在哪个模块上做 sql 日志记录 都要记录哪些信息才能做到跨机房数据同步时,具有可查询.可分析.可监控的目的 sql 日志记录的模式或者说频率 针对 MoDB 要做跨机房数据的同步这个功能,那么可以对 sql 语句进行记录的"地方"有:  modb 应用中 Atlas 应用中 其中 Atlas 目前已支持 sql 日志的记录,格式如下:  ? 1 [11/25/2013 14:58

Mysql客户端不支持鉴定协议的解决方法

MySQL 5.1采用了基于密码混编算法的鉴定协议,它与早期客户端(4.1之前)使用的协议不兼容.如 果你将服务器升级到4.1之上,用早期的客户端进行连接可能失败,并给出下述消息: shell> mysql 客户端不支持服务器请求的鉴定协议:请考虑升级MySQL客户端. 要想解决该问题,应使用下述方法之一: ·升级所有的客户端程序,以使用4.1.1或更新的客户端库. ·用4.1版之前的客户端连接到服务器时,请使用仍具有4.1版之前风格密码的账户. ·对于需要使用4.1版之前的客户端的每位用户,将

14款经典的MySQL客户端软件

不用我说,大家都知道Mysql是一个怎么样的数据库.虽然它的命运比较坎坷, 但是丝毫没有影响到我们对Mysql的热情.不论是个人程序或者网站,还是企业数据库,Mysql的身影无处不在.无论做什么数据库的开发, 一款 合适的客户端软件可以让你达到事半功倍的效果.下面就我自己使用mysql客户端的经验,再参考其他人的情况做如下汇总,希望对你的数据开发有所帮助. 1. EMS MySQL Manager 强大的mysql管理工具,允许用户通过图形界面创建或编辑数据库对象,并提供通过sql语句管理用户和

支持php mysql 的免费空间

支持php mysql 的免费空间  1Majorhost.com了一些最功能免费托管网络服务在互联网上.我们确信,我们将击败任何其他免费主机...我们可以向你们保证如下: 万兆存储空间 99.98 %的服务器正常运行 65Gb每月数据传输 Linux企业操作系统 的FTP支持 PHP 4的支持 MySQL的第4支 快速的服务器与低负荷时   用户控制面板 我们的免费托管服务拥有最好的用户控制面板周围净.我们有一个易于操作的基于Web的界面了网站的统计资料,限制,交通, SQL和更多. 您的整个

与MySQL客户端库的链接问题

当你链接到应用程序以使用MySQL客户端库时,可能会遇到以mysql_开始的未定义引用错误,如下所示: /tmp/ccFKsdPa.o: 在函数`main'中: /tmp/ccFKsdPa.o(.text+0xb): 对`mysql_init'的未定义引用. /tmp/ccFKsdPa.o(.text+0x31): 对`mysql_real_connect'的未定义引用. /tmp/ccFKsdPa.o(.text+0x57): 对`mysql_real_connect'的未定义引用. /tmp

MySQL客户端命令行应用技巧

图像化导向的MySQL管理工具比比皆是,但真正能够提速而且并非"图有其表"的管理工具,可能没有 哪一个比得上MySQL客户端驱动的命令行更有效了.不过,执行一般查询需要大量键盘输入工作,而且确 定您目前正在登录的数据库以及快速监测数据库服务器的性能都会变得很单调乏味. 改变客户端提示符 如果每运行一次show tables来提醒自己目前所选择的是哪个数据库就能得到一块钱的话,估计现在我 都成百万富翁了.事实上,当我们不停的定期在IDE.shell提示符和MySQL客户端提示符之间切换的

DBA应当了解的MySQL客户端程序启动选项

许多服务器管理员都知道,MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为.然而,大部分人却不清楚,标准MySQL客户端带有同等大量的启动选项,其中一些在日常MySQL交互作用中极为有用.这些选项本身不是"秘密",而它们中很多未被使用,甚至其中一些可以显著利于服务器交互作用的过程处理. 表中是其中一些不太知名的MySQL客户程序启动选项.表格中的每一条目解释了每个选项的功能以及用法.这将给予你MySQL应用范围和深度等问题一些想法,帮

用多路复用I/O模型实现支持多个客户端的通信服务

引言 多路复用I/O模型是UNIX/LINUX用得的最多的一种I/O模型.这种I/O模型在技术上的实现是包括select()以及FD_XXX的几个宏及常量.在单个进程中支持的客户端数量由FD_SETSIZE决定.Solaris 10和Linux 9.0默认为1024个,Windows 2000是64个.本文用代码给出该I/O模型处理多Client的一种实现. 用select开发一个通信服务器 这个服务器包括接收模块.发送模块和套接口管理模块.我们只演示与select实现有关的部分,即接收模块和套