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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
 在研究完 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 获取结果?
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
7月前
|
网络协议 关系型数据库 MySQL
1.4 启动MySQL客户端程序
1.4 启动MySQL客户端程序
45 0
|
7月前
|
关系型数据库 MySQL 数据库
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
375 0
|
1月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
84 1
|
3月前
|
SQL 关系型数据库 MySQL
免费MySQL数据库客户端推荐
免费MySQL数据库客户端推荐
63 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库免费客户端简介
MySQL数据库免费客户端简介
36 0
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL企业版与标准版功能对比:如何选择适合您的版本?
随着数字化时代的到来,企业对于数据处理的需求越来越高,而数据库作为数据处理的核心,其性能和成本成为了企业关注的焦点。阿里云全新推出的PolarDB MySQL企业版和标准版,以全新的架构和优化,为企业提供了高性能、低成本的数据库解决方案。但在功能上,这两个版本有很多差异,我们该如何选择呢?
56 2
|
3月前
|
JavaScript 关系型数据库 MySQL
基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)
基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版:强大功能,超高性能,满足企业级需求
PolarDB MySQL版:强大功能,超高性能,满足企业级需求 在当今信息化社会,企业对于数据处理的需求日益增长,如何选择一款高性能、高可靠性且成本合理的数据库成为了一大挑战。阿里巴巴的PolarDB MySQL版应运而生,它不仅兼容MySQL,还具备传统数据库所不具备的优势,为企业提供了更高效、更可靠的数据处理方案。
107 3
|
4月前
|
关系型数据库 MySQL Shell
百度搜索:蓝易云【Shell脚本实现Mysql持续kill功能】
将以上代码保存为一个名为 `kill_mysql.sh`的文件,并确保该文件具有执行权限(可以使用 `chmod +x kill_mysql.sh`命令赋予执行权限)。然后在终端中运行该脚本即可实现MySQL的持续kill功能。
49 0