Windows环境下Code::Blocks中成功配置MySQL Connector/C连接MySQL数据库

下面我将介绍当需要用C语言开发能访问MySQL数据库的程序时成功配置的关键事项。

操作系统:Windows 7 x64

编程环境:Code::Blocks 10.05(32bit)

配置方式说明:用C语言开发访问MySQL数据库至少有3种配置方式。

         方式1:使用MySQL Connector/C二进制发行版,在运行C语言开发环境的机器中只用MySQL Connector/C,不安装MySQL Server。这种方式的适用场合是:本机不需要安装庞大的MySQL Server程序,我们的C语言程序访问的数据库服务器程序在远程的某个主机上(通过网络能访问到它),数据库服务器程序不在本机。这种是轻量级方式。此时MySQL Connector/C 提供了头文件mysql.h,静态链接库mysqlclient.lib,动态链接库libmysql.dll。此外还提供了当需要动态链接库时的静态导入库libmysql.lib。

        方式2:使用MySQL Connector/C二进制发行版,在运行C语言开发环境的机器中不装MySQL Connector/C,但安装了MySQL Server。这种方式的使用场合是:需要访问的目标数据库就在本机,因此本机安装了MySQL Server。这种方式的Code::Blocks环境配置与方式1相同,只是mysql.h所在的include目录以及libmysql.lib,libmysql.dll所在的lib目录的路径在MySQL Server的安装目录下。

        以上两种方式中,如果是你使用的是MySQL Connector/C Community版,则需要预先安装Microsoft Visual C++ Redistributable forVisual Studio 2015,至于是安装x64版还是x86版,需要看你计算机的配置情况而定。

       方式3:使用MySQL Connector/C的源代码。将此源代码与你的C程序源代码一起编译。这种方式过程比较繁琐,具体可参考MySQL官网相关文档:https://dev.mysql.com/doc/connector-c/en/connector-c-installation-source.html


本文介绍的安装方式为方式1。

关键步骤和注意事项:

(1)在MySQL官网上下载MySQL Connector/C的二进制发行版的zip包。请注意版本为win32版,不要下载winx64版。建议不下载msi包,因为该包是自动解压的Program File或Program File(x86)目录的MySQL目录下,还不如自己解压到指定目录。

(2)将以上下载的mysql-connector-c-*.*.*-win32.zip压缩包解压到指定的文件夹。本例中解压在“C:\MySQL Connector C 6.1 for Win X32”目录下。

(3)新建Code::Blocks项目。

(4)配置编译时头文件mysql.h所在位置,配置链接时所需的libmysql.lib,libmysql.dll所在位置。单击Code::Blocks菜单“Project”-->"Build Options..."。弹出如下窗口。请选择左边框中的"Debug",这表示本项目的“Debug”配置。


然后,设置需要连接的库文件所在位置。选择“Linker Settings”选项卡,单击“Add”按钮,选择刚才解压的MySQL Connectors/C压缩包解压后目录中的lib目录下的libmysql.lib。单击“确定”后,如下图所示。


如果这一步没有配置后,在编译时,将提示无法解析程序中的MySQL API函数。


然后,设置include目录和lib目录作为搜索路径。首先,单击“Search directories”选显卡的“Compiler”子选项卡,单击“Add”将MySQ  Connector/C解压目录下的include 目录添进来。这是mysql.h头文件所在位置。


如果程序运行时出现编译时找不到MySQL API中的函数的错误,那一定是此步骤的mysql.h头文件所在的include 目录的位置没有配置好。


接下来,请单击“Search directories”选显卡的“Linker”子选项卡,单击“Add”将MySQ  Connector/C解压目录下的lib 目录添进来。这是libmysql.dll动态链接库文件所在位置。虽然静态链接库文件libmysql.lib也在此文件,但是这个静态链接库在“Linker Settings”中已经进行了设置。


如果程序的编译通过了,但是运行时出现如下错误,那么一定是因为此步骤中libmysql.dll的搜索位置没有设置好。




请用如下代码测试:

#include <stdio.h>
#include <winsock2.h> //因为要进行网络连接
#include <mysql.h> //因为使用了MySQL C API访问mysql数据库


int main() {
    MYSQL mysql; //mysql数据库连接
    mysql_init(&mysql);//初始化mysql连接


    char host[]="192.168.0.123";//MYSQL服务器的主机名或IP,本机为localhost
    char user[]="user";//mysql数据库登录的用户名
    char passwd[]="123456";//mysql数据库登录的密码
    char db[]="mydatabase";//要连接的数据库名
    unsigned int port=3306;//MySQL服务器的TCP/IP端口号,默认为3306
    char *unixSocket=NULL;//连接类型
    unsigned int clientFlag=CLIENT_FOUND_ROWS;//MySQL运行ODBC数据库的标记


    MYSQL_RES *res_ptr; //指向查询结果的指针
    MYSQL_FIELD *field; //指向字段结构体的指针
    MYSQL_ROW result_row; //按行返回的select结果,即一行记录。
    int rowCnt, colCnt; //select结果返回的记录行数和列数
    int res; //执行sql语句后的返回标志
    int i, j;


    //建立mysql连接
    if (NULL != mysql_real_connect(&mysql,
                                   host,
                                   user,
                                   passwd,
                                   db,
                                   port,
                                   unixSocket,
                                   clientFlag)) {
        //连接成功
        printf("数据库连接成功!\n");


        //设置查询编码为gbk,以支持中文
        mysql_query(&mysql, "set names gbk");


        char *sql;
        sql="select * from users"; //请改为对自己数据的表进行查询的SQL语句。
        res = mysql_query(&mysql, sql);
        if (res) { //执行查询语句失败
            printf("查询语句执行失败 !\n");
            //关闭连接
            mysql_close(&mysql);
        } else { //查询语句执行成功
            //将查询的结果赋值给res_ptr
            res_ptr = mysql_store_result(&mysql);
            //如果记录集不为空,就把每条记录按行输出
            if (res_ptr) {
                //取得结果记录集的行数和字段数
                rowCnt = mysql_num_rows(res_ptr);
                colCnt = mysql_num_fields(res_ptr);
                printf("查询到 %d 行 \n", rowCnt);
                //输出记录的字段名
                for (i = 0; field = mysql_fetch_field(res_ptr); i++)
                    printf("%10s ", field->name);
                printf("\n");
                //按行输出每条记录
                for (i = 1; i < rowCnt+1; i++) {
                    result_row = mysql_fetch_row(res_ptr);
                    for (j = 0; j < colCnt; j++)
                        printf("%10s ", result_row[j]);
                    printf("\n");
                }
            }
            //最后,不再使用数据库时,请不要忘了关闭连接,释放资源。
            mysql_close(&mysql);
        }
    } else {
        printf("数据库连接失败!");
    }
    return 0;
}


有两个层面上的测试。

第一层测试,Code::Blocks是否能正常编译使用MySQL Connector/C API的代码。

第二层测试:数据库是否能被程序代码正常访问。

如果以上代码能够正常运行,那就恭喜你,配置和链接成功了。



如果程序编译通过了,但是在运行时出现如下错误,


那么极有可能是MySQL API与所需的VC++2015Resdistribute 的版本不匹配。

经过验证,正确的匹配模式是:

32的gcc编译器 

MySQL Connector/C32位的x86版

VC++2015Resdistribute32位的x86版

以上组合就没有问题。其他组合,可能有问题。


如下出现编译时找不到MySQL API中的函数的错误,那一定是mysql.h头文件的位置没有配置好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离散卷积过程举例图示详解

卷积结果的通俗解释&#xff1a; f(x)是待处理的信号。通常地&#xff0c;该函数数据个数比较多。 g(x)是对信号前后相关性的描述的函数。通常地&#xff0c;该函数非零数据个数比较少。它通常具有在(-∞,∞)内可积且快速收敛的特性。 对于本例中的函数g(x)&#xff0c;卷积…

c语言数据结构将链串里所有值为x的字符删除_redis数据结构与对象到底长什么样?...

写在前面前方高能&#xff01;前方高能&#xff01;前方高能&#xff01;文章较长&#xff0c;可能需要花费您两个小时的时间&#xff0c;请做好心理准备&#xff0c;但是一旦你准备看下去&#xff0c;我相信您一定会有收获&#xff0c;不枉此行&#xff0c;let’s go!!!一、简…

java中判断字段真实长度(中文2个字符,英文1个字符)的方法

public class Char_cn { public static void main(String[] args) { // TODO Auto-generated method stub String haha "我叫兜兜abcd"; int true_num String_length(haha); System.out.println("true" true_num); int false_num haha.length();…

mysql主从技术_MySQL主从架构的实现

目录一主一从1.1 环境准备&#xff1a;1.2 准备步骤&#xff1a;1.3 实现步骤:1.3.1 配置master主服务器1.3.2 创建复制帐号1.3.3 查看主服务器状态1.3.4 配置slave从服务器1.3.5 启动从服务器复制线程1.3.6 查看从服务器状态1.3.7 测试1.4 扩展——实现一主多从1.4.1 需求分析…

C# winfrom listView

转自http://hi.baidu.com/gaoisbest/item/84034943d4d94195823ae12b 1.如何为listview手动添加第一列和第二列数据 for (int i 0; i < 10; i) { ListViewItem Item new ListViewItem(); Item.Text dt.Rows[i][1].ToString();//读取数据库中字段 Item.Tag dt.…

[教程指导]索尼官方4.0.3系统一键root方法! [复制链接]

[教程指导]索尼官方4.0.3系统一键root方法&#xff01; [复制链接] 青青子衿198976青青子衿198976注册时间2011-9-26最后登录2012-9-15在线时间730 小时阅读权限150积分3996帖子1173精华32UID13306151版主 在线时间730 小时经验1629 分贡献2693 点极币10442 极币最后登录2012-9…

python --函数

转http://www.cnblogs.com/vamei/archive/2012/06/01/2529500.html 函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数&#xff0c;以后你想实现相同的操作的时候&#xff0c;只用调用函数名就可以&#xff0c;而不需要重复敲所有的语句。 函数的定…

国外网站设计欣赏:30个优秀的国外咖啡网站设计

梦想天空博客向大家分享各种类型的优秀网站作品&#xff0c;有电子商务网站设计、旅游网站设计、餐馆网站设计、设计工作室网站设计、大学网站设计以及各种色系&#xff0c;各种风格的网站设计作品。今天这篇文章给大家带来30个优秀的国外咖啡网站设计作品&#xff0c;一起欣赏…

【译】CodeIgniter HMVC模块扩展使用文档

CodeIgniter HMVC扩展说明 原文地址&#xff1a;Modular Extensions - HMVC 模块扩展——HMVC 模块扩展让CodeIgniter框架模块化。模块是一组独立的组件&#xff08;通常有模型、控制器和视图&#xff09;&#xff0c;它们被分类在应用模块的子文件夹中&#xff0c;并且能够直接…

python函数参数类型及顺序_python函数参数类型及其顺序

根据inspect模块官文文档中关于函数参数类型的相关说明&#xff0c;python函数参数共有五种类型&#xff0c;按顺序分别为&#xff1a;POSITIONAL_ONLY、POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、KEYWORD_ONLY、VAR_KEYWORD。如图&#xff1a;POSITIONAL_ONLY&#xff1a;参数值…

JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

原文:JS组件系列——Bootstrap Table 表格行拖拽&#xff08;二&#xff1a;多行拖拽&#xff09;前言&#xff1a;前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽&#xff0c;今天接到新的需要&#xff0c;需要在之前表格行拖拽的基础上能够同时拖拽选中的多行。博主用…

scrapy知乎爬虫mysql存储项目_Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写...

思路分析&#xff1a;(1)选定起始人(即选择关注数和粉丝数较多的人--大V)(2)获取该大V的个人信息(3)获取关注列表用户信息(4)获取粉丝列表用户信息(5)重复(2)(3)(4)步实现全知乎用户爬取实战演练&#xff1a;(1)、创建项目&#xff1a;scrapy startproject zhijutest(2)、创建爬…

kali下生成web端后门

很多时候在***测试时选择web***害怕用的别人的马带有后门&#xff0c;这样自己的辛苦就要被别人不劳而获&#xff0c;很多时候我们都想拥有自己的马&#xff0c;那么这个时候你就应该使用kail来生成一个自己独特密码的web***了。Kali Linux自带有好几个web***生成工具&#xff…

素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)

因为文中存在公式&#xff0c;只能用图片方式上传了&#xff01; 以下为C语言源代码&#xff1a; #include <stdio.h> typedef long long unsigned LLU; typedef int BOOL; #define TRUE 1 #define FALSE 0 BOOL isPrime(LLU n) { //这是传统的方法&#xff0c;用于与…

MongoDB源码阅读之ReplSet源码分析

1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义了几乎所有replSet相关的类&#xff08;Member:replSet中的节点成员&#xff0c; GhostSync&#xff1a;备份同步类&#xff0c;Rep…

C# 字符串性能

Written By Dr Herbie [2] Translated By Allen Lee Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。程序中需要考虑两个由于使用字符串而产生的问题&#xff1a;临时字符串变量的使用和字符串连接。Background1.String是引用类型&#xff0c;在堆上…

手把手教你部署VSAN见证虚拟设备 (Cormac)

译者注&#xff1a;本文翻译自Cormac的博客&#xff0c;并未严格地逐字逐句的直译&#xff0c;如有谬误&#xff0c;万望见谅。原文见此http://cormachogan.com/2015/09/14/step-by-step-deployment-of-the-vsan-witness-appliance/现在开始在之前的帖子中我曾经介绍过见证虚拟…

PyCharm编程环境的中英文字体分别设置的好处多----一石三鸟地解决中文字体不一致、英文字体不涵盖中文字符、编程字体实用性兼顾美观性的三个问题

在编程环境&#xff08;例如Python的PyCharm&#xff09;中&#xff0c;我们希望编程环境的字体具有如下特性&#xff1a; &#xff08;1&#xff09;字体覆盖中文和英文字符。 &#xff08;2&#xff09;等宽字体&#xff0c;并且是TrueType字体&#xff0c;方便辨识代码中缩…

WordPress博客系统的安全

随着计算机网络的流行&#xff0c;越来越多的人开始创建自己的博客&#xff0c;论起博客系统&#xff0c;全球用的最多的博客系统就是wordpress&#xff08;以下简称WP&#xff09;。但是如果用过WP的人都应该知道&#xff0c;WP的站点想要做的好看&#xff0c;插件是必不可少的…

mysql为什么行数据库_关系数据表中的行称为什么?

在一个二维表中&#xff0c;水平方向的行称为元组&#xff0c;每一行是一个元组&#xff1b;元组对应表中的一个具体记录。数据元组也称为记录。一个数据表中的每一个记录均有一个惟一的编号(记录号)。一个记录也就是数据表中的一行。元组(tuple)是关系数据库中的基本概念&…