开发者社区> 摩云飞> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【原创】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 获取结果?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MyCat-架构剖析-MySQL 协议简介 | 学习笔记
快速学习 MyCat-架构剖析-MySQL 协议简介
0 0
MyCat-架构剖析-MyCat 实现 MySQL 协议 | 学习笔记
快速学习 MyCat-架构剖析-MyCat 实现 MySQL 协议
0 0
解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题
mysql模块(项目地址为https://github.com/mysqljs/mysql)是一个开源的、JavaScript编写的MySQL驱动,可以在Node.js应用中来操作MySQL。但在使用过程中,出现了“ER_NOT_SUPPORTED_AUTH_MODE”问题。
9039 0
mysql 协议的server状态标识
git https://github.com/sea-boat/mysql-protocol 概况 server状态标识。
751 0
mysql 协议的ResultsetRow包及解析
git https://github.com/sea-boat/mysql-protocol 概况 ResultsetRow包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的行记录。
896 0
mysql 协议的ColumnDefinition包及解析
git https://github.com/sea-boat/mysql-protocol 概况 ColumnDefinition包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的字段信息。
918 0
mysql 协议的ColumnCount包及解析
git https://github.com/sea-boat/mysql-protocol 概况 ColumnCount包属于服务端返回ResultSet时的其中一部分包。
888 0
+关注
摩云飞
十年磨一剑,我还差几年~~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
搭建电商项目架构连接MySQL
立即下载
搭建4层电商项目架构,实战连接MySQL
立即下载
让 MySQL 原生分布式触手可及
立即下载