qingzhuang 发表于 2013-1-27 06:26:18

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

/*****************************************************************以下是研究 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,argv,argv,argv,atoi(argv));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;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 ? currrow : "NULL")<<"\t";}std::cout<<endl; } mysql_free_result(result) ;system("pause"); return 1;}Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=829502
页: [1]
查看完整版本: 收藏:MySQL 5 C API 访问数据库例子程序