天天看点

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

#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;

}