注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作  

2012-07-07 23:57:29|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
注:一下内容全部为本人亲测,原则上是没有问题的,如果按照文章实践出现任何问题都可以给我发邮件(hfutld@yeah.net),经常检查邮箱。祝君实践愉快。Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
这周搞数据库的课程设计,起初是准备用MySQL的原生态API进行编程的,但是在连接过程中遇到了一些问题,具体的问题描述见前博文数据库课程回忆录——一篇文章解决MySQL的安装,配置,连接各种可能问题,在实践用原生态API进行MySQL数据库连接的过程中遇到了一些问题,本来是参考这篇博文的Visual C++ 读写 MySQL 但实践过程中却出现了各种问题,故为了给以后学习者一定的帮助,对原博客的内容进行了一定的修正,总结如下:
首先讲下注意事项:如果你的机子是64位的,那么在MySQL的默认安装情况下是只安装64位的Connector的无论是C,C++还是ODBC连接,这种情况就导致了如果按照原文去做会出现我上面博文里提到的连接错误,无法解析32位下的Connector符号!解决办法是:开始——所有程序——MySQL——MySQLWindows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
 然后在修改中将32位的连接组件安装进去,具体过程见我上篇博文,这里就不再赘述了。
————————————————————————————————————————————————————-——————
首先说下路径配置问题,这个问题对于老手肯定不存在任何问题,但对于新手来说可能就优点云里来雾里去了,在理解路径之前首先要理解一个概念:库。库分为静态库和动态库,Windows的静态库为LIB,动态库为DLL。什么是库呢?有的库是编译好的二进制文件即LIB文件,是一系列的目标文件的组合体(什么是目标文件?目标文件就是编译器编译后的文件但是还没有进行模块链接的二进制文件)举例说明:一般的库可以分为开源库和非开源库,开源库即是提供源代码给用户,用户自己编译成库文件的库,在这个过程中用户可以根据自己的需求去定制库的内容如Boost库;非开源库则是只为用户提供接口描述而具体的库文件是以编译好的二进制目标文件集合形式给出的,例如MFC库。
编译好的库的两大组成:头文件和实现文件。头文件里有接口或者函数声明和描述,而实现文件则是对接口和函数的实现。就好比我们在头文件中声明类,而在源文件中定义类是一样的道理。既然知道这个了,那么和我们平常编程的道理一样,我们要在调用MySQL库的时候首先要包含MySQl函数的文件,当然包含头文件的方式可以是直接将MySQL安装文件夹下Connector下的include文件都拷贝到工程下,但是,你不觉得这太不优雅了吗?每次弄都要拷贝,而且很有可能我们不知道需要哪个头文件,这样都拷贝过来很麻烦,而对于像Boost这样的大库,全部拷贝也不现实。那么怎么办呢?基本上所有的开发环境都提供了一种更为优雅的方式:直接设置想要包含的头文件存储路径,具体到VC++上来就是在项目属性中做如下的配置:
Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
 好了,现在头文件有了,那么当你把头文件包含进来了,但是实现文件没有,这不是扯淡吗?当然我们也不能很粗暴的将所有的实现文件LIB文件拷贝到工程下了,优雅的解决方式也是让工程知道我们将用到的库文件在神马地方:
Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
 本来到这里配置应该就结束了,但是不知道为什么还需要设置一项就是附加依赖性,这里我对这个还不是很清楚,网上也没找到对应的资料,比较悲剧。
但是知道怎么做就可以了:
Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
最后一步配置就结束了:将C:\Program Files (x86)\MySQL\Connector C 6.0.2\lib\opt (如果你的是32位系统就没有那个(X86))文件夹下的libmysql.dll和libmysql.lib拷贝到工程目录下(和源文件一个文件下)
Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
到此配置全部结束!
————————————————————————————————————————————————————————
下面是在原博客封装上的修正版本(原博客有多处错误!)原文不带接口描述,这里我也不写了,本身都很简单,简单的单词完全顾名思义了。在VC++里新建一个工程,先按照上面的三个步骤进行配置,然后按照文件名建立文件,编译运行就可以了。
我MySQl的端口号是1017,这和默认值不同(默认值为3306),请注意。另外我MySQL中建立的示例数据库名称为sdb,其中一个表项为student,具体截图如下:
Windows上Visual C++环境下利用MySQL的C语言API连接MySQL数据库进行操作 - 刘邓 - 刘邓
 

 

//头文件LDMySQL.h
#include <stdio.h>
#include <string>
#include <afxsock.h>
#include "mysql.h"
using namespace std;
class LDMySQL
{
public:

//变量
MYSQL mysql;


LDMySQL();
~LDMySQL();


int ConnMySQL(char *host,unsigned int port,char * Db,char * user,char* passwd,char * charset,string& Msg);

string SelectData(char * SQL,int Cnum ,string& Msg);

int InsertData(char * SQL,string& Msg);

int UpdateData(char * SQL,string& Msg);

int DeleteData(char * SQL,string& Msg);


void CloseMySQLConn();

};

//源文件LDMySQL.cpp
#include "stdafx.h"
#include "LDMySQL.h"

LDMySQL::LDMySQL()
{
}

LDMySQL::~LDMySQL()
{
}

//初始化数据
int LDMySQL::ConnMySQL( char *host,unsigned int port ,char * Db,char * user,char* passwd,char * charset,string& Msg)
{
if( mysql_init(&mysql) == NULL )
{
Msg = "inital mysql handle error";
return 1;
}

if (mysql_real_connect(&mysql,host,user,passwd,Db,port,NULL,0) == NULL)
{
Msg = "Failed to connect to database: Error";
return 1;
}

if(mysql_set_character_set(&mysql,"GBK") != 0)
{
Msg = "mysql_set_character_set Error";
return 1;
}
return 0;
}

//查询数据
string LDMySQL::SelectData(char * SQL,int Cnum,string& Msg)
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[2048];
sprintf(sql,SQL);
int rnum = 0;
char rg = 0x06;//行隔开
char cg = {0x05};//字段隔开

if(mysql_query(&mysql,sql) != 0)
{
Msg = "select ps_info Error";
return "";
}
m_res = mysql_store_result(&mysql);

if(m_res==NULL)
{
Msg = "select username Error";
return "";
}
string str("");
while(m_row = mysql_fetch_row(m_res))
{
for(int i = 0;i < Cnum;i++)
{
str += m_row[i];
str += rg;
}
str += rg;
rnum++;
}

mysql_free_result(m_res);

return str;
}

//插入数据
int LDMySQL::InsertData(char * SQL,string& Msg)
{
char sql[2048];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) == 0)
{
Msg = "Insert Data Error";
return 1;
}
else Msg = "插入成功!";
return 0;
}

//更新数据
int LDMySQL::UpdateData(char * SQL,string& Msg)
{
char sql[2048];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != 0)
{
Msg = "Update Data Error";
return 1;
}
else Msg ="更新成功!";
return 0;
}

//删除数据
int LDMySQL::DeleteData(char * SQL,string& Msg)
{
char sql[2048];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != 0)
{
Msg = "Delete Data error";
return 1;
}
else Msg = "删除成功";
return 0;
}

//关闭数据库连接
void LDMySQL::CloseMySQLConn()
{
mysql_close(&mysql);
}

//Main函数所在文件HelloMySQL.cpp
#include "stdafx.h"
#include "LDMySQL.h"
#include <string>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
char* host="127.0.0.1";//主机号,本地开发一般就是这个
char* user="root";//安装配置时的用户名
int port =1017;//安装配置用户名,默认情况下应该是3306的
char* passwd="7531055";//安装配置时的用户密码
char* dbname="sdb"; //选择要操作的数据库
char* charset = "GBK";//支持中文
string Msg = "";//消息变量
//初始化
LDMySQL * ldmysql = new LDMySQL;
if(ldmysql->ConnMySQL(host,port,dbname,user,passwd,charset,Msg) == 0)
printf("连接成功\r\n");
else
std::cout<<Msg;


char * SQL = "SELECT * FROM student";//SQL语句,既然你要用进行数据库编程,这点基本的还是需要知道的
string str = ldmysql->SelectData(SQL,4,Msg);
if( str.length() > 0 )
{
printf("查询成功\r\n");
printf(str.data());
printf("\r\n");
}
else
{
cout<<Msg<<endl;
}

//插入
SQL = "insert into student values('20092699','刘邓','19911110','男','汉','700','计算机2班','2009')";
ldmysql->InsertData(SQL,Msg) ;
cout<<Msg<<endl;

//更新
SQL = "update student set student_name = '修改了' where student_sid = 20092676 ";
ldmysql->UpdateData(SQL,Msg) ;
cout<<Msg<<endl;
SQL = "delete from vcaccesstest where ids = 3 ";
ldmysql->DeleteData(SQL,Msg) ;
cout<<Msg<<endl;
ldmysql->CloseMySQLConn();

return 0;
}

  评论这张
 
阅读(2389)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018