MySQL 5 C API 访问数据库例子程序

原创 2006年06月24日 15:15:00


/*****************************************************************
以下是研究 mysql 5.0 得出的结果,描述并使用标准 c++演示了使用 MySQL
 C API 函数 简单操作数据库的流程;
 例子程序在 VC6 + windows 2000 上调试通过
*****************************************************************/
#include <windows.h>
#include <iostream>
#include <mysql.h> //文件位于 MySQL 提供的 C API 目录(include)中
using namespace std;

// linux 等系统中请加入 -lmysql -I/usr/local/mysql/inlucde
#pragma comment( lib, "libmysql.lib")

class CMysqlConnect
{
private:
 //一个连接
 MYSQL *m_connmysql;
 std::string m_err;
protected:
 //
public:
 CMysqlConnect(const std::string &host,
            const std::string &user,
            const std::string &password,
      const std::string &dbname,
      unsigned int port);
 ~CMysqlConnect();
 //bool
 //得到连接
 MYSQL * GetConnect();

 //得到错误消息
 const std::string What();
};

CMysqlConnect::CMysqlConnect(const std::string &host,
            const std::string &user,
            const std::string &password,
      const std::string &dbname,
      unsigned int port = MYSQL_PORT):m_connmysql(NULL)
{
 //初始化数据结构
 if((m_connmysql = mysql_init(m_connmysql)) == NULL)
 {
  return;
 }

 if(NULL == mysql_real_connect(m_connmysql,host.c_str(),
  user.c_str(),password.c_str(),dbname.c_str(),port,NULL,0))
 {
  m_err = mysql_error(m_connmysql);
  return ;
 }
}


CMysqlConnect::~CMysqlConnect()
{
 if(m_connmysql)
 {
  mysql_close(m_connmysql);
  m_connmysql = NULL;
 }
}


//得到连接
MYSQL * CMysqlConnect::GetConnect()
{
 if(m_connmysql == NULL)
 {
  //throw std::logic_error("db not connect");
 }

 //还需要判断是否能自动重新连接

 return m_connmysql;
}

 //得到错误消息
const std::string CMysqlConnect::What()
{
 return m_err;
}

/*****************************************************************/
///name       : main
//function    : 主测试函数
//access      : public
//para        :
//         1. : int argc
//            : 系统参数个数
//         2. : char * argv[]
//            : 参数数值
//return      : 返回给 startup 函数的退出参数
//author      : hzh
//date        : 2006-06-24
/*****************************************************************/
int main( int argc, char * argv[] )
{   
 CMysqlConnect *myconn = NULL;  
 
 //连接数据库
 if(argc == 1)
 {
  myconn = new CMysqlConnect("127.0.0.1","root","mysql5",
   "test",MYSQL_PORT);
  if(myconn == NULL)
  {
   std::cout<<"allocate memory exception"<<endl;
   return -1;
  }
  if(myconn->GetConnect() == NULL)
  {
   std::cout<<"connect database fail"<<
    endl<<myconn->What().c_str()<<endl;
   return -1;
  }
 }else if(argc == 6)
 {
  myconn = new CMysqlConnect(argv[1],argv[2],argv[3],argv[4],atoi(argv[5]));
  if(myconn == NULL)
  {
   std::cout<<"allocate memory exception"<<endl;
   return -1;
  }
  if(NULL == myconn->GetConnect())
  {
   std::cout<<"connect database fail"<<endl<<
    myconn->What().c_str()<<endl;
   return -1;
  }
 }
 else
 {
  std::cout<<"run parameter error"<<endl;
  return -1;
 }

 MYSQL *mydata = myconn->GetConnect();

 //先删除数据表
 std::string s_sql = "drop table hzhtest";
 if(mysql_query(mydata,s_sql.c_str()) != 0)
 {
  //删除表失败
  std::cout<<"drop table fail"<<endl<<mysql_error(mydata)<<endl;
 }
 else
 {
  std::cout<<"drop table success"<<endl;
 }

 //创建数据表,字段 myid 设置了自增列属性
 s_sql = "create table hzhtest(";
 s_sql += "myid integer not null auto_increment,";
 s_sql += "mytime datetime null,myname varchar(30),";
 s_sql += " primary key(myid))";
 if(mysql_query(mydata,s_sql.c_str()) != 0)
 {
  //创建表失败
  std::cout<<"create table fail"<<endl;
  return -1;
 }
 else
 {
  std::cout<<"create table success"<<endl;
  std::cout<<s_sql.c_str()<<endl;
 }

 //向表中插入数据
 for(int k = 1; k < 30; ++k)
 {
  s_sql = "insert into hzhtest(mytime,myname) values";
  s_sql += "('2006-06-";
  char buff[20];
  memset(buff,0,sizeof(buff));
  itoa(k,buff,10);
  s_sql += buff;
  
  s_sql += " ";

  int i = k % 3;
  memset(buff,0,sizeof(buff));
  itoa(i,buff,10);
  s_sql += buff;
  s_sql += ":01:01'";

  if(i == 0)
  {
   s_sql += ",NULL";
  }
  else
  {
   s_sql += ",'中文显示测试";
   s_sql += buff;
   s_sql += "'";
  }
  s_sql += ")";

  if(mysql_query(mydata,s_sql.c_str()) != 0)
  {
   //执行SQL语句出错
   std::cout<<"execute insert syntax fail"<<endl;
   return -1;
  }
 }
 std::cout<<"insert data success"<<endl;

 //查询数据并显示
 s_sql = "select myid,mytime,myname from hzhtest";
 if(mysql_query(mydata,s_sql.c_str()) != 0)
 {
  //执行SQL语句出错
  return -1;
 } 
 
 MYSQL_RES *result = mysql_store_result(mydata);

 //取得查询结果
 int rowcount = mysql_num_rows(result);
 //取得有效记录数
 std::cout<<"exec sql: "<<s_sql.c_str()<<
  ",row count: "<<rowcount<<endl;

 MYSQL_FIELD *fields = NULL;
 //取得各字段名
 for(int i = 0; fields = mysql_fetch_field(result);++i)
 {
  std::cout<<fields->name<<"/t/t";
 }
 std::cout<<endl;
   
 //依次读取各条记录
 MYSQL_ROW currrow = NULL;
 while((currrow = mysql_fetch_row(result)) != NULL)
 {
  //读行的记录
  for(int i = 0; i < mysql_num_fields(result); ++i)
  {
   std::cout<<(currrow[i] ? currrow[i] : "NULL")<<"/t";
  }
  std::cout<<endl;
 }
 mysql_free_result(result) ;

 system("pause");
 return 1;
}

MYSQL数据库在C语言API函数接口

MYSQL在 C 语言 中可用的API:   mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。 mysql_clos...
  • HKaisa
  • HKaisa
  • 2016年07月20日 21:47
  • 2140

C API--linux上c语言读取数据库内容(mysql)

通过c语言读取数据库的内容
  • guoqianqian5812
  • guoqianqian5812
  • 2014年11月22日 13:59
  • 1764

解决使用MySQL C-API开发应用时的连接超时问题

解决使用MySQL C-API开发应用时的连接超时问题 标签: mysqlMySQL 2008-09-20 20:24 3384人阅读 评论(1) 收藏 举报  分类: ...
  • boshuzhang
  • boshuzhang
  • 2017年02月28日 10:44
  • 525

C连接MySQL数据库开发之Windows环境配置及测试

一、开发环境 Win8.1 64位、VS2013、MySQL5.5.37 64位 MySQL安装目录为:C:\Program Files\MySQL\MySQL Server 5.5 二、配置工程...
  • xyang81
  • xyang81
  • 2014年05月24日 15:42
  • 2903

C/C++连接mysql数据库(vs)

注:本篇只介绍在VS上C/C++与Mysql数据库的连接,默认已经搭建好数据库,如果没有,请先学习相关资料搭建好数据库后再来阅读本文。 开门见山,直入主题。 我们要做的其实只有两步:(1)将工程的头文...
  • yy64578537
  • yy64578537
  • 2016年04月16日 17:09
  • 1397

ubuntu环境中操作MySQL,使用C语言API调用MySQL

前言:最近准备做毕业设计,初次接触到MySQL,做一个学习记录 安装MySQL:傻瓜式安装 sudo apt-get install mysql-server apt-get install l...
  • zouwm12
  • zouwm12
  • 2016年09月03日 13:23
  • 1062

CentOS使用MySQL的详细步骤,及C API编程

1.1 执行yum命令安装MySQL yum -y install mysql mysql-server 1.2 把添加MySQL进开机启动项,并立即启动MySQL chkconfi...
  • dotphoenix
  • dotphoenix
  • 2013年01月26日 10:57
  • 19011

mysql c api简单连接池

连接池为了解决频繁的创建、销毁所带来的系统开销。 简而言之,就是 自己先创建一定量的连接,然后在需要的时候取出一条连接使用。 当然如果你只有一个线程连接数据库,而且不是实时返回结果,那么你完全不必...
  • midle110
  • midle110
  • 2014年02月20日 17:32
  • 4225

使用Hibernate连接Mysql数据库

数据库名称:test 数据表名称:user 数据库数据:int id primary AUTO_INCREMENT,String name,int age;   首先需要先...
  • Marco115
  • Marco115
  • 2016年07月24日 22:22
  • 2010

通过MySQL提供的C API访问MySQL数据库

在VISUAL C++中访问MySQL 数据库的方式有很多种,可以直接采用ODBC 的方式,也可以采用ADO 访问(此两种方法均需要安装MySQL ODBC驱动)。但是除此之外,MySQL 还提供了一...
  • Leonhubert
  • Leonhubert
  • 2013年03月31日 15:49
  • 1103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL 5 C API 访问数据库例子程序
举报原因:
原因补充:

(最多只允许输入30个字)