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