随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获取信息的最重要手段之一。众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。网站搭建中用的最多的数据库服务器是oracle和MySQL,前者功能强大,属于旗舰型数据库服务器,但前期投入太大;后者功能不断完善,简单易用而又不失性能,并且可以免费获得。因此,许多中小型网站的数据库服务器选用MySQL,而且,由于MySQL性能出色,一些大型网站也选用了MySQL。
由此可见,MySQL数据库服务器在网站建设中的表现是十分出色的。但是,正因为这样,几乎很少有人将MySQL用于应用软件的开发中。本文将详细介绍VC环境中MySQL数据库服务器不同接口的应用,并最终将产生一个CDatabase类封装MySQL数据库接口功能。
利用MySQL自带的C API函数实现数据库功能调用
本程序利用VC.NET的控制台项目来实现:
实现步骤:
1、打开VC.NET,选择新建-》项目,在出现的对话框的模板中选择WIN32控制台项目,在名称中填项目名称mysqltest,在位置中选择项目放置的路径,点击确认,出现下一个对话框,直接点击完成,项目就自动生成了。
2、展开mysqltest项目,在右击头文件,选择添加新项,在出现的对话框中从右边的模板中选择头文件(.h),在名字中输入头文件的名字:database,点击打开。在database.h输入代码如下:
// Database.h: interface for the CDatabase class.
//
//
#ifndef H_DATABASE_H
#define H_DATABASE_H
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
3、展开mysqltest项目,在右击源文件,选择添加新项,在出现的对话框中从右边的模板中选择C++文件(.CPP),在名字中输入源文件的名字:database,点击打开。在database.cpp输入代码如下:
// Database.cpp: implementation of the CDatabase class.
//
//
#include "stdafx.h"
#include "Database.h"
//
// Construction/Destruction
//
CDatabase::CDatabase()
{
mysql_init(&mysql);
}
CDatabase::~CDatabase()
{
mysql_free_result(query);
mysql_close(&mysql);
}
BOOL CDatabase::SelectAll(Data_Param *para)
{
//mysql_free_result(query);
unsigned int i=0;
char str[50];
sprintf(str,"select * from %s",para->tab_name);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::DelRecord(Data_Param *para)
{
char str[80];
sprintf(str,"delete from %s where %s",para->tab_name,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::InsertRecord(Data_Param *para)
{
char str[80];
sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectRecord(Data_Param *para)
{
// mysql_free_result(query);
unsigned int i=0;
char str[80];
sprintf(str,"select %s from %s where %s",para->select_exp,para->tab_name,para->where_def);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectDB(Data_Param *para)
{
if (mysql_select_db(&mysql,para->db_name))
return false;
else
return true;
}
char * CDatabase::OutErrors()
{
return(mysql_error(&mysql));
}
BOOL CDatabase::FindSave(char *str)
{
if(mysql_query(&mysql,str))
return false;
query=mysql_store_result(&mysql);
return true;
}
BOOL CDatabase::UpdateRecord(Data_Param *para)
{
char str[150];
sprintf(str,"update %s set %s where %s",para->tab_name,para->set_exp,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
my_ulonglong CDatabase::GetRowNum()
{
return (mysql_num_rows(query));
}
MYSQL_ROW CDatabase::GetRecord()
{
return (row = mysql_fetch_row(query));
}
BOOL CDatabase::ConnectDB(Database_Param *p)
{
if (!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag))
{
OutErrors();
return false;
}
return true;
}
unsigned int CDatabase::GetFieldNum()
{
return (mysql_num_fields(query));
}
void CDatabase::FreeRecord()
{
mysql_free_result(query);
}
int CDatabase::CreateDB(char *db)
{
return (mysql_create_db(&mysql,db));
}
void CDatabase::SeekData(int offset)
{
mysql_data_seek(query,offset);
}
int CDatabase::DropDB(char *db)
{
return (mysql_drop_db(&mysql,db));
}
BOOL CDatabase::IsEnd()
{
return mysql_eof(query);
}
char* CDatabase::GetFieldName(int FieldNum)
{
field=mysql_fetch_field_direct(query,FieldNum);
return field->name;
}
char * CDatabase::GetClientInfo()
{
return mysql_get_client_info();
}
char* CDatabase::GetHostInfo()
{
return mysql_get_host_info(&mysql);
}
int CDatabase::GetProtocolInfo()
{
return mysql_get_proto_info(&mysql);
}
char* CDatabase::GetServerInfo()
{
return mysql_get_server_info(&mysql);
}
char* CDatabase::GetState()
{
char* state=mysql_stat(&mysql);
if(!state)
return OutErrors();
return state;
}
4、展开mysqltest项目,在mysqltest.cpp输入代码如下:
// mysqltest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Database.h"
int _tmain(int argc, _TCHAR* argv[])
{
struct Data_Param *dp = new Data_Param();
struct Database_Param *dbp= new Database_Param();
MYSQL_ROW row;
//Database_Param 初始化参数
dbp->host = "localhost";
dbp->user = "root";
dbp->password = "";
dbp->db = "testdb";
dbp->port = 3306;
dbp->unix_socket = NULL;
dbp->client_flag = 0;
//Data_Param 初始化参数
dp->db_name = "testdb";
dp->tab_name = "user";
CDatabase cdb;
try
{
//连接mysql数据库
if(cdb.ConnectDB(dbp) == false)
{
printf("connect failed!/n");
delete dp;
delete dbp;
return -1;
}
else
printf("connect success!/n");
//获得mysql版本信息
printf("mysql version is [%s]/n",cdb.GetServerInfo());
//查询user表
if( !cdb.SelectAll(dp) )
printf("select failed/n");
else
printf("select success/n");
//打印user表中的数据
printf("%s/t/t%s/t%s/t%s/n",cdb.GetFieldName(0),cdb.GetFieldName(1),cdb.GetFieldName(2),cdb.GetFieldName(3));
while(row = cdb.GetRecord())
{
for (int i=0 ; i < cdb.GetFieldNum(); i++)
{
printf("%s/t/t",row[i]);
}
printf("/n");
}
delete dp;
delete dbp;
}
catch(...)
{}
return 0;
}
其中连接的数据库名是testdb,用户名是root,密码为空,表名是user。
5、右击mysqltest项目,选择属性,在编译器-》命令行中加入:libmysql.lib wsock32.lib
6、下载mysql++-1.7.1-win32-vc++.zip开发包,把其中的mysql中的include和lib文件夹拷入项目的目录中,然后在VC.net的工具-》选项中的库文件和引用文件中加入上面的include和lib的绝对路径,最后把lib中的libmySQL.dll拷到项目的debug中,一切都OK了
调试-》开始执行,结果如下:
connect success!
mysql version is [5.0.7-beta-nt]
select success
userid username password email
1 aaa aaa aaaa
2 bbb bbbb bbbb@sina.com
Press any key to continue
MySQL作为一个免费的SQL数据库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL数据库的开发者也在力求使之更加完善。并且,由MySQL性能测试可以看出,它对数据的处理速度明显快于其它数据库服务器。因此,如果应用软件对数据库的性能要求较高,而同时对数据库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL数据库服务器不失为一个最佳的选择。
希望各位成功!!!!!
由此可见,MySQL数据库服务器在网站建设中的表现是十分出色的。但是,正因为这样,几乎很少有人将MySQL用于应用软件的开发中。本文将详细介绍VC环境中MySQL数据库服务器不同接口的应用,并最终将产生一个CDatabase类封装MySQL数据库接口功能。
利用MySQL自带的C API函数实现数据库功能调用
本程序利用VC.NET的控制台项目来实现:
实现步骤:
1、打开VC.NET,选择新建-》项目,在出现的对话框的模板中选择WIN32控制台项目,在名称中填项目名称mysqltest,在位置中选择项目放置的路径,点击确认,出现下一个对话框,直接点击完成,项目就自动生成了。
2、展开mysqltest项目,在右击头文件,选择添加新项,在出现的对话框中从右边的模板中选择头文件(.h),在名字中输入头文件的名字:database,点击打开。在database.h输入代码如下:
// Database.h: interface for the CDatabase class.
//
//
#ifndef H_DATABASE_H
#define H_DATABASE_H
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
3、展开mysqltest项目,在右击源文件,选择添加新项,在出现的对话框中从右边的模板中选择C++文件(.CPP),在名字中输入源文件的名字:database,点击打开。在database.cpp输入代码如下:
// Database.cpp: implementation of the CDatabase class.
//
//
#include "stdafx.h"
#include "Database.h"
//
// Construction/Destruction
//
CDatabase::CDatabase()
{
mysql_init(&mysql);
}
CDatabase::~CDatabase()
{
mysql_free_result(query);
mysql_close(&mysql);
}
BOOL CDatabase::SelectAll(Data_Param *para)
{
//mysql_free_result(query);
unsigned int i=0;
char str[50];
sprintf(str,"select * from %s",para->tab_name);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::DelRecord(Data_Param *para)
{
char str[80];
sprintf(str,"delete from %s where %s",para->tab_name,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::InsertRecord(Data_Param *para)
{
char str[80];
sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectRecord(Data_Param *para)
{
// mysql_free_result(query);
unsigned int i=0;
char str[80];
sprintf(str,"select %s from %s where %s",para->select_exp,para->tab_name,para->where_def);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectDB(Data_Param *para)
{
if (mysql_select_db(&mysql,para->db_name))
return false;
else
return true;
}
char * CDatabase::OutErrors()
{
return(mysql_error(&mysql));
}
BOOL CDatabase::FindSave(char *str)
{
if(mysql_query(&mysql,str))
return false;
query=mysql_store_result(&mysql);
return true;
}
BOOL CDatabase::UpdateRecord(Data_Param *para)
{
char str[150];
sprintf(str,"update %s set %s where %s",para->tab_name,para->set_exp,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
my_ulonglong CDatabase::GetRowNum()
{
return (mysql_num_rows(query));
}
MYSQL_ROW CDatabase::GetRecord()
{
return (row = mysql_fetch_row(query));
}
BOOL CDatabase::ConnectDB(Database_Param *p)
{
if (!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag))
{
OutErrors();
return false;
}
return true;
}
unsigned int CDatabase::GetFieldNum()
{
return (mysql_num_fields(query));
}
void CDatabase::FreeRecord()
{
mysql_free_result(query);
}
int CDatabase::CreateDB(char *db)
{
return (mysql_create_db(&mysql,db));
}
void CDatabase::SeekData(int offset)
{
mysql_data_seek(query,offset);
}
int CDatabase::DropDB(char *db)
{
return (mysql_drop_db(&mysql,db));
}
BOOL CDatabase::IsEnd()
{
return mysql_eof(query);
}
char* CDatabase::GetFieldName(int FieldNum)
{
field=mysql_fetch_field_direct(query,FieldNum);
return field->name;
}
char * CDatabase::GetClientInfo()
{
return mysql_get_client_info();
}
char* CDatabase::GetHostInfo()
{
return mysql_get_host_info(&mysql);
}
int CDatabase::GetProtocolInfo()
{
return mysql_get_proto_info(&mysql);
}
char* CDatabase::GetServerInfo()
{
return mysql_get_server_info(&mysql);
}
char* CDatabase::GetState()
{
char* state=mysql_stat(&mysql);
if(!state)
return OutErrors();
return state;
}
4、展开mysqltest项目,在mysqltest.cpp输入代码如下:
// mysqltest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Database.h"
int _tmain(int argc, _TCHAR* argv[])
{
struct Data_Param *dp = new Data_Param();
struct Database_Param *dbp= new Database_Param();
MYSQL_ROW row;
//Database_Param 初始化参数
dbp->host = "localhost";
dbp->user = "root";
dbp->password = "";
dbp->db = "testdb";
dbp->port = 3306;
dbp->unix_socket = NULL;
dbp->client_flag = 0;
//Data_Param 初始化参数
dp->db_name = "testdb";
dp->tab_name = "user";
CDatabase cdb;
try
{
//连接mysql数据库
if(cdb.ConnectDB(dbp) == false)
{
printf("connect failed!/n");
delete dp;
delete dbp;
return -1;
}
else
printf("connect success!/n");
//获得mysql版本信息
printf("mysql version is [%s]/n",cdb.GetServerInfo());
//查询user表
if( !cdb.SelectAll(dp) )
printf("select failed/n");
else
printf("select success/n");
//打印user表中的数据
printf("%s/t/t%s/t%s/t%s/n",cdb.GetFieldName(0),cdb.GetFieldName(1),cdb.GetFieldName(2),cdb.GetFieldName(3));
while(row = cdb.GetRecord())
{
for (int i=0 ; i < cdb.GetFieldNum(); i++)
{
printf("%s/t/t",row[i]);
}
printf("/n");
}
delete dp;
delete dbp;
}
catch(...)
{}
return 0;
}
其中连接的数据库名是testdb,用户名是root,密码为空,表名是user。
5、右击mysqltest项目,选择属性,在编译器-》命令行中加入:libmysql.lib wsock32.lib
6、下载mysql++-1.7.1-win32-vc++.zip开发包,把其中的mysql中的include和lib文件夹拷入项目的目录中,然后在VC.net的工具-》选项中的库文件和引用文件中加入上面的include和lib的绝对路径,最后把lib中的libmySQL.dll拷到项目的debug中,一切都OK了
调试-》开始执行,结果如下:
connect success!
mysql version is [5.0.7-beta-nt]
select success
userid username password email
1 aaa aaa aaaa
2 bbb bbbb bbbb@sina.com
Press any key to continue
MySQL作为一个免费的SQL数据库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL数据库的开发者也在力求使之更加完善。并且,由MySQL性能测试可以看出,它对数据的处理速度明显快于其它数据库服务器。因此,如果应用软件对数据库的性能要求较高,而同时对数据库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL数据库服务器不失为一个最佳的选择。
希望各位成功!!!!!