admin 管理员组

文章数量: 887032


2024年1月18日发(作者:如何删除应用程序扩展文件)

C++程序与MySql数据库连接

——陈绍钦 csq

有很多种技术可以让C++程序利用数据库:ODBC、DB、DAO、ADO、API等,ODBC是传统的方法功能强大,ADO比较便捷,并逐渐代替了DAO。对于mysql数据库来说,其提供的API函数和PHP中mysqli函数相差不大,毕竟mysql是用c语言写的,可以说懂得了PHP和mysql的结合,就懂得了c++与mysql的结合。以下是C++程序里利用mysql数据库的简略说明。

一、MySQL的安装

可以考虑安装mysql-5.0.41-win32(可到/soft/处下载),当然你有更新的版本更好,注意选择“完全安装”(只有这样才会安装VC编译时需要的头文件等)。安装后期会进行服务器配置,你可以设置你的服务器登陆密码,也可以不设置密码。

二、VC6.0的设置

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

Files/MySQL/MySQL Server 5.0/include)。

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

5.0/lib/debug)。

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

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

#include "winsock.h"

#include "mysql.h"

#pragmacomment(lib,"")

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

三、数据库、表的创建

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

mysql> SHOW DATABASES;

mydbmysql> USE mydb;

//显示所有的数据库,注意一定要敲“;”后再按回车

//创建数据库

//选择你所创建的数据库

//显示数据库中的表

mysql> CREATE DATABASE mydb;

mydbmysql> 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为端口号,可自行设定;若mysql不是本地服务器,所用的mysql用户必须能远程登录及其他必要的权限(比如select、update、delete的使用),若连接错误代码为10061,可在mysql服务器(此为linux)运行netstat –anp查看mysql正在监听的IP及端口,若为127.0.0.1即只监听本机,可在或文件中修改为0.0.0.0

1 / 4

——MFC与MySql——

//显示表的结构

//数据库连接句柄

{ AfxMessageBox("数据库连接失败"); return FALSE;}

(1)实现添加功能

CString strUsername,strList,strRemark,strSQL;

("insert into mytable(username,visitelist,remark) values(/'%s/',/'%s/',/'%s/')",

strUsername,strList,strRemark); //注意一定要写在一行,而且必须要有

if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)gth())!=0)

{ AfxMessageBox("增添失败"); }

(2)实现修改功能

CString strUsername,strList,strRemark,strSQL,str_PreName;

请看源代码

("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)gth())!=0)

{ AfxMessageBox("修改失败"); }

(3)实现删除功能

CString strSQL;

("delete from mytable where username=/'%s/'",str_PreName);

{ AfxMessageBox("删除失败"); }

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

m_AllItems();

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))

{

("%s",row[0]);

m_Item(i,str);

("%s",row[1]);

m_mText(i,1,str);

("%s",row[2]);

m_mText(i,2,str);

i++;

}

——MFC与MySql——

//str_PreName用于记录想要修改的行,详情 //必须要有

if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)gth())!=0)

2 / 4

mysql_free_result(result);

(5)关闭数据库:mysql_close(&mysql);

五、结束语

本文在几位网友的工作基础上详细介绍了MySQL的安装、调试,以及如何用VC进行编译,实现数据的“添加、修改、删除”等功能,可以为在MySQL的VC编程中感到困惑的朋友们提供一点帮助,在此向几位网友表示感谢!

values()里面的符号应该为/'%s/',为单引号。

更多MYSQL库函数请访问:/books/mysqlmanual/manual_

Mysql.h 库函数(重要的函数已加粗):

20.4.1 mysql_affected_rows ()返回受到最后一个UPDATE、DELETE或INSERT查询影响(变化)的行数。

20.4.2 mysql_close ()关闭一个以前打开了的连接。

20.4.3 mysql_connect ()该函数不推荐使用,而更好使用mysql_real_connect()

20.4.4 mysql_change_user ()

20.4.5 mysql_create_db ()这个函数不推荐,而最好使用mysql_query()发出一条SQL CREATE DATABASE语句

20.4.6 mysql_data_seek ()在一个查询结果集合中定位任意行。

20.4.7 mysql_debug ()

20.4.8 mysql_drop_db ()这个函数不推荐,而最好使用mysql_query()发出一条SQL DROP DATABASE语句。

20.4.9 mysql_dump_debug_info ()

20.4.10 mysql_eof ()这个函数不推荐,而使用mysql_errno()或mysql_error()。

20.4.11 mysql_errno ()无错则返回零,返回最近调用的可能成功或失败的API函数的错误代码,下同

20.4.12 mysql_error ()无错则返回空

20.4.13 mysql_escape_string ()

20.4.14 mysql_fetch_field ()返回作为一个MYSQL_FIELD结构的一个结果集合的一个列的定义,重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,mysql_fetch_field()返回NULL

//最好写到OnDestroy()函数中

20.4.15 mysql_fetch_fields ()返回一个结果集合的所有MYSQL_FIELD结构的数组。每个结构提供结果结合中一列的字段定义

20.4.16 mysql_fetch_field_direct ()

20.4.17 mysql_fetch_lengths ()返回在结果集合内的当前行的列长度

20.4.18 mysql_fetch_row ()检索一个结果集合的下一行

20.4.19 mysql_field_count ()返回在连接上的最近查询的列的数量

20.4.20 mysql_field_seek ()将字段光标设置到给定的偏移量

20.4.21 mysql_field_tell ()返回用于最后一个mysql_fetch_field()的字段光标的位置

20.4.22 mysql_free_result ()释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为一个结果集合分配的内存

20.4.23 mysql_get_client_info ()返回代表客户库的版本的字符串

20.4.24 mysql_get_host_info ()返回描述正在使用的连接类型的字符串,包括服务其主机名

20.4.25 mysql_get_proto_info ()返回当前连接使用的协议版本

20.4.26 mysql_get_server_info ()

20.4.27 mysql_info ()

20.4.28 mysql_init ()分配或初始化适合mysql_real_connect()的一个MYSQL对象

20.4.29 mysql_insert_id ()返回由先前的查询为一个AUTO_INCREMENT列生成的ID

20.4.30 mysql_kill ()要求服务器杀死由pid指定的线程

20.4.31 mysql_list_dbs ()

——MFC与MySql——

3 / 4

20.4.32 mysql_list_fields ()

20.4.33 mysql_list_processes ()返回一个描述当前服务器线程的结果集合

20.4.34 mysql_list_tables ()

20.4.35 mysql_num_fields ()在结果集合中返回列的数量

20.4.36 mysql_num_rows ()在结果集合中返回行的数量

20.4.37 mysql_options ()

20.4.38 mysql_ping ()检查到服务器的连接是否正在工作。如果它关闭了,自动尝试一个再连接。

20.4.39 mysql_query ()执行指向空终止的字符串query的SQL查询,查询必须由一个单个的SQL语句组成

20.4.40 mysql_real_connect ()试图建立到运行host的一个MySQL数据库引擎的一个连接

20.4.41 mysql_real_query ()执行由query指向的SQL查询,它应该是一个length个字节的字符串

20.4.42 mysql_reload ()要求MySQL服务器再次装载授权表。连接的用户必须拥有reload权限,不推荐这个函数。最好使用mysql_query()发出一条SQL FLUSH PRIVILEGES语句

20.4.43 mysql_row_seek ()设置行光标为在结果集合中的任意行

20.4.44 mysql_row_tell ()返回为了mysql_fetch_row()的行光标的当前位置

20.4.45 mysql_select_db ()

20.4.46 mysql_shutdown ()让数据库服务器关闭。连接的用户必须有shutdown权限

20.4.47 mysql_stat ()返回包含类似于由mysqladmin status命令提供的信息的一个字符串

20.4.48 mysql_store_result ()详——下

20.4.49 mysql_thread_id ()返回当前连接的线程ID

20.4.50 mysql_use_result ()详——下

对于成功地检索数据的每个询问(SELECT、SHOW、DESCRIBE、EXPLAIN),你必须调用mysql_store_result()或mysql_use_result()。

mysql_store_result()读取一个到客户的查询的全部结果,分配一个MYSQL_RES结构,并且把结果放进这个结构中。

如果没有行返回,返回一个空集合集合。(空结果集合不同于一个NULL返回值。)一旦你调用了mysql_store_result(),你可以调用mysql_num_rows()找出结果集合中有多少行。你能调用mysql_fetch_row()从结果集合中取出行,或mysql_row_seek()和mysql_row_tell()结果集合中获得或设置当前的行位置。

一旦你用完结果集合,你必须调用mysql_free_result()。

mysql_use_result()初始化一个结果集合的检索,但不真正将结果集合读入客户,就象mysql_store_result()那样。相反,必须通过调用mysql_fetch_row()单独检索出每一行,这直接从服务器读出结果而不在一个临时表或本地缓冲区中存储它,它比mysql_store_result()更快一点并且使用较少的内存。客户将只为当前行和一个可能最大max_allowed_packet字节的通信缓冲区分配内存。在另一方面,如果你在客户端对每一行正在做很多的处理,或如果输出被送到屏幕,用户可以打一个^S(停止滚动),你不应该使用mysql_use_result()。这将阻塞服务器并且阻止另外的线程从数据被取出的任何表中更新数据。当使用mysql_use_result()时,你必须执行mysql_fetch_row()直到返回一个NULL值,否则未取出的行将作为下一个查询的结果集合一部分被返回。如果你忘记做这个,C API将给出错误Commands out of sync; You can't run this command now!你不能在一个从mysql_use_result()返回的结果集合上使用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows(),你也不能发出另外的查询直到mysql_use_result()完成。(然而,在你取出所有的行以后,mysql_num_rows()将精确地返回取出的行数。)一旦你用完结果集合,你必须调用mysql_free_result()。

——MFC与MySql——

4 / 4


本文标签: 结果 集合 返回 连接