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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
 在研究完 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 获取结果?
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
1月前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
2月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
107 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
2月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
46 3
|
2月前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
28 2
|
3月前
|
关系型数据库 MySQL 存储
|
2月前
|
存储 分布式计算 DataWorks
DataWorks产品使用合集之在本地客户端一直无法连接ADB MySQL,是什么原因
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用合集之如何实现类似mysql实例中的数据库功能
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
3月前
|
存储 负载均衡 关系型数据库
面试题MySQL问题之通过配置FastDFS提高性能如何解决
面试题MySQL问题之通过配置FastDFS提高性能如何解决
45 1
|
3月前
|
关系型数据库 MySQL 调度
MySQL高级功能与优化策略深度探索
MySQL高级功能与优化策略深度探索