C++的VS2010和MySQL数据库的链接问题举例分析

66次阅读
没有评论

共计 6751 个字符,预计需要花费 17 分钟才能阅读完成。

这篇文章主要讲解了“C++ 的 VS2010 和 MySQL 数据库的链接问题举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“C++ 的 VS2010 和 MySQL 数据库的链接问题举例分析”吧!

// 下面的代码是一个实现 C ++ 连接 MYSQL 数据库的很好的例子
// 这里用了建表,插入,检索,删表等常用功能
// 我用 VC++6.0 生成,已经成功连接了。// 在 VC++6.0 中要想把做一下两步准备工作才可以。//(1)Tools- Options- Directories- Include files 中添加 C:\Program Files\MySQL\MySQL Server 6.0\include
//(2)Tools- Options- Directories- Library files 中添加 C:\Program Files\MySQL\MySQL Server 6.0\lib\opt
// 其实就是将头文件和库文件包含进来
// 我觉得这个例子写的很好,再结合自己的试验,特地介绍给大家!#include  winsock.h 
#include  iostream 
#include  string 
#include  mysql.h 
using namespace std;
#pragma comment(lib,  ws2_32.lib)
#pragma comment(lib,  libmysql.lib)
// 单步执行,不想单步执行就注释掉
#define STEPBYSTEP
int main() {
 cout    ****************************************    endl;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 必备的一个数据结构
 MYSQL mydata;
 // 初始化数据库
 if (0 == mysql_library_init(0, NULL, NULL)) {cout    mysql_library_init() succeed    endl;
 } else {cout    mysql_library_init() failed    endl;
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 初始化数据结构
 if (NULL != mysql_init( mydata)) {cout    mysql_init() succeed    endl;
 } else {cout    mysql_init() failed    endl;
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 在连接数据库之前,设置额外的连接选项
 // 可以设置的选项很多,这里设置字符集,否则无法处理中文
 if (0 == mysql_options( mydata, MYSQL_SET_CHARSET_NAME,  gbk)) {cout    mysql_options() succeed    endl;
 } else {cout    mysql_options() failed    endl;
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 连接数据库
 if (NULL
 != mysql_real_connect( mydata,  localhost ,  root ,  test ,  test ,
 3306, NULL, 0))
 // 这里的地址,用户名,密码,端口可以根据自己本地的情况更改
 cout    mysql_real_connect() succeed    endl;} else {cout    mysql_real_connect() failed    endl;
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 //sql 字符串
 string sqlstr;
 // 创建一个表
 sqlstr =  CREATE TABLE IF NOT EXISTS user_info 
 sqlstr +=  ( 
 sqlstr +=
 user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT  Unique User ID , 
 sqlstr +=
 user_name VARCHAR(100) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NULL COMMENT  Name Of User , 
 sqlstr +=
 user_second_sum INT UNSIGNED NOT NULL DEFAULT 0 COMMENT  The Summation Of Using Time 
 sqlstr +=  
 if (0 == mysql_query( mydata, sqlstr.c_str())) {cout    mysql_query() create table succeed    endl;
 } else {cout    mysql_query() create table failed    endl;
 mysql_close(mydata);
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 向表中插入数据
 sqlstr =
 INSERT INTO user_info(user_name) VALUES(公司名称),(一级部门),(二级部门),(开发小组),( 姓名 
 if (0 == mysql_query( mydata, sqlstr.c_str())) {cout    mysql_query() insert data succeed    endl;
 } else {cout    mysql_query() insert data failed    endl;
 mysql_close(mydata);
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 显示刚才插入的数据
 sqlstr =  SELECT user_id,user_name,user_second_sum FROM user_info 
 MYSQL_RES *result = NULL;
 if (0 == mysql_query( mydata, sqlstr.c_str())) {cout    mysql_query() select data succeed    endl;
 // 一次性取得数据集
 result = mysql_store_result(mydata);
 // 取得并打印行数
 int rowcount = mysql_num_rows(result);
 cout    row count:     rowcount   endl;
 // 取得并打印各字段的名称
 unsigned int fieldcount = mysql_num_fields(result);
 MYSQL_FIELD *field = NULL;
 for (unsigned int i = 0; i   fieldcount; i++) {field = mysql_fetch_field_direct(result, i);
 cout   field- name    \t\t 
 cout   endl;
 // 打印各行
 MYSQL_ROW row = NULL;
 row = mysql_fetch_row(result);
 while (NULL != row) {for (int i = 0; i   fieldcount; i++) {cout   row[i]    \t\t 
 cout   endl;
 row = mysql_fetch_row(result);
 } else {cout    mysql_query() select data failed    endl;
 mysql_close(mydata);
 return -1;
#ifdef STEPBYSTEP
 system( pause 
#endif
 // 删除刚才建的表
 sqlstr =  DROP TABLE user_info 
 if (0 == mysql_query( mydata, sqlstr.c_str())) {cout    mysql_query() drop table succeed    endl;
 } else {cout    mysql_query() drop table failed    endl;
 mysql_close(mydata);
 return -1;
 mysql_free_result(result);
 mysql_close(mydata);
 mysql_server_end();
 system( pause 
 return 0;
}

原文地址:C++ 日记——Mysql 和 vs2010  的连接作者:赤道与北极

使用的是 API 方式,使用 Mysql 的数据库资源,所以需要包含头文件、连接 Lib 和获取相应的 dll 文件。

一 vc 的设置

这里使用的是 vs2010,所以附上 vs2010 的设置

(1)打开 VC6.0 工具栏 Tools 菜单下的 Options 选项,在 Directories 的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装 MySQL 的 include 目录路径。(我的是 D:Program FilesMySQLMySQL Server 5.0include)。

vs2010 中的设置,在:项目 - 属性 - 配置属性 -VC++ 目录 - 包含目录

(2)在上面说到的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装 MySQL 的 Lib 目录路径。Lib 目录下还有 debug 和 opt 两个目录,建议选 debug。(我的是 D:Program FilesMySQLMySQL Server 5.0libdebug)。

vs2010 中的设置,在:项目 - 属性 - 配置属性 -VC++ 目录 - 库目录

或者:项目 - 属性 - 配置属性 - 连接器 - 常规 - 附加库目录

(3)在“Project settings- Link:Object/library modules”里面添加“libmysql.lib”。

vs2010 中的设置,在:项目 - 属性 - 配置属性 - 连接器 - 输入 - 附加依赖项

(4)在 stdafx.h 里面添加如下的内容:

 

#include  mysql.h 
#include  winsock.h  //  如果编译出错, 则把该行放到 #include  mysql.h 之前 #pragma comment(lib, libmySQL.lib) //  如果在附加依赖项里已增加, 则就不要添加了 

 

(5)建议将“libmySQL.lib、libmySQL.dll”拷到你所建的工程的目录下。

这个也需要!

 

二 数据库的相关操作

打开“开始 - 所有程序 - MySQL- MySQL Server 5.0- MySQL Command Line Client.exe”,如果没有设置密码就直接按回车,会提示服务器启动成功。

mysql  SHOW DATABASES;// 显示所有的数据库,注意一定要   敲“;”后再按回车
mysql  CREATE DATABASE mydb;// 创建数据库 mydb
mysql  USE mydb;// 选择你所创建的数据库 mydb
mysql  SHOW TABLES; // 显示数据库中的表
mysql  CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),

remark VARCHAR(200));// 创建一个表 mytable: 用户名;访问列表

 

;备注
mysql DESCRIBE mytable;// 显示表的结构

 

三 VC 编程

 

MYSQL mysql; // 数据库连接句柄
mysql_init (mysql);
if(!mysql_real_connect( mysql, localhost , root ,NULL, mydb ,3306,NULL,0)) {//mydb 为你所创建的数据库,3306 为端口号,可自行设定  
AfxMessageBox( 数据库连接失败  
return FALSE;
}

 

(1)实现添加 功能

 

CString strUsername,strList,strRemark,strSQL;
strSQL.Format(insert into mytable(username,visitelist,remark) values(%s , %s , %s) , strUsername,strList,strRemark);// 注意一定要写在一行,而且必须要有 
if(mysql_real_query( mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ 
AfxMessageBox(增添失败  }

(2)实现修改功能

 

 

CString strUsername,strList,strRemark,strSQL,str_PreName;//str_PreName 用于记录想要修改的行,详情请看源代码
strSQL.Format(update mytable set username= %s ,visitelist= %s , remark= %s  where username= %s ,strUsername,strList,strRemark,str_PreName);
if(mysql_real_query( mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ 
AfxMessageBox(修改失败  }

 

(3)实现删除功能

 

CString strSQL;
strSQL.Format(delete from mytable where username= %s ,str_PreName);// 必须要有 
if(mysql_real_query( mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ 
AfxMessageBox(删除失败  }

 

(4)读取表格内容到 CListCtrl 控件 m_list

 

m_list.DeleteAllItems();
char *ch_query;
ch_query= select * from mytable 
if(mysql_real_query( mysql,ch_query,(UINT)strlen(ch_query))!=0){ 
AfxMessageBox( 数据库中表格出错  
CString str;
MYSQL_RES *result;
MYSQL_ROW row;
if(!(result=mysql_use_result( mysql))){ 
AfxMessageBox( 读取数据集失败  
int i=0;
while(row=mysql_fetch_row(result)){str.Format( %s ,row[0]);
m_list.InsertItem(i,str);
str.Format(%s ,row[1]);
m_list.SetItemText(i,1,str);
str.Format(%s ,row[2]);
m_list.SetItemText(i,2,str);
mysql_free_result(result);
 做一些添加:
while (row=mysql_fetch_row(result))
{num=mysql_num_fields(result);
for (int j=0;j j++)
...}
mysql_fetch_row 依次获取受影响的行,当结束时返回 NULL,mysql_num_fields 获取该行的列数。注意,这里的 row 是 char**  类型,即 row[i] 是 char* 类型。

(5)关闭数据库

mysql_close(mysql);// 最好写到 OnDestroy() 函数中 

感谢各位的阅读,以上就是“C++ 的 VS2010 和 MySQL 数据库的链接问题举例分析”的内容了,经过本文的学习后,相信大家对 C ++ 的 VS2010 和 MySQL 数据库的链接问题举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计6751字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)