?? mysql.cpp
字號:
// MySql.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "MySql.h"
//一個字段結構
typedef struct _FIELDS
{
char field_name[DEFAULT_FIELD_SIZE];//字段名
void * filed_value; //字段值的指針
unsigned value_len; //字段的長度,只適用于字符串類型
}FIELDS,*PFIELDS;
//一行數據的結構數組
typedef struct _ROWS{
FIELDS fields[DEFAULT_FIELD]; //字段,根據不同的應用程序可以修改此值
int cnt; //多少個字段,指示field中元素的有效個數
}ROWS,*PROWS;
MySql::MySql()
{
result=NULL;
memset(m_host,0,32);
memset(m_name,0,32);
memset(m_pwd,0,32);
m_port=0;
mysql_init(&myData);
//設置連接超時
unsigned timeout=5*60;
mysql_options(&myData, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&timeout);
//啟動再連接
my_bool reconnect=TRUE;
mysql_options(&myData, MYSQL_OPT_RECONNECT, (char *)&reconnect);
//初始化HashTable大小為100
res.InitHashTable(100);
}
MySql::~MySql()
{
Close();
}
//連接MySql服務器
BOOL MySql::Connect(char * host,char * name,char *pwd,char * db,unsigned port)
{
BOOL bRet=TRUE;
strcpy(m_host,host);
strcpy(m_name,name);
strcpy(m_pwd,pwd);
m_port=port;
do
{
//連接服務器
if(mysql_real_connect(&myData,host,name,pwd,db,port,NULL,0)==NULL)
{
bRet=FALSE;
break;
}
//設置連接字符集,默認為gb2312
if(mysql_set_character_set(&myData, "gb2312"))
{
bRet=FALSE;
//如果設置字符集不成功,則關閉連接
Close();
break;
}
//設置允許多語句支持
mysql_set_server_option(&myData, MYSQL_OPTION_MULTI_STATEMENTS_ON);
}while(0);
return bRet;
}
//執行非查詢語句
BOOL MySql::ExecuteNoQuery(char ** sqlArray,int count)
{
BOOL uRet=TRUE;
//撤消自動提交模式
mysql_autocommit(&myData, 0);
for(int i=0;i<count;i++)
{
mysql_query(&myData,sqlArray[i]);
//查詢受影響的行數
//uRet=uRet+(unsigned)mysql_affected_rows(&myData);
}
//如果沒有成功
if(mysql_commit(&myData))
{
//回滾事務
mysql_rollback(&myData);
uRet=FALSE;
}
//恢復自動提交模式
mysql_autocommit(&myData, 0);
return uRet;
}
//執行查詢語句
unsigned MySql::ExecuteQuery(char * sql)
{
unsigned uLine=0,uField=0;
PROWS rows;
MYSQL_ROW row;
MYSQL_FIELD *pField;
//釋放前一次的結果集
FreeResult();
//查詢
mysql_query(&myData,sql);
//存儲結果集
result=mysql_store_result(&myData);
//如果結果集為空,則返回0
if(result==NULL)return 0;
//獲得行數
uLine=(unsigned)mysql_num_rows(result);
//獲得字段數
uField=(unsigned)mysql_num_fields(result);
//填充結果集
for(int i=0;i<(int)uLine;i++)
{
//為存儲一行數據分配內存
rows=(PROWS)malloc(sizeof(ROWS));
//一行有多少個字段
rows->cnt=uField;
//獲得一行數據
row=mysql_fetch_row(result);
for(int j=0;j<(int)uField;j++)
{
//獲得該列的相關信息
pField=mysql_fetch_field_direct(result, j);
//列名稱
strcpy(rows->fields[j].field_name,pField->name);
//列值
rows->fields[j].filed_value=row[j];
//列寬度
rows->fields[j].value_len=pField->max_length;
}
//將一行數據存儲到HashTable中
res.SetAt(i,(void *)rows);
}
//返回行數
return uLine;
}
//釋放查詢的結果集
void MySql::FreeResult()
{
int len=0;
PROWS rows=NULL;
len=res.GetCount();
//釋放結果集的內存
for(int i=0;i<len;i++)
{
rows=(PROWS)res[i];
if(rows!=NULL)
{
free(rows);
rows=NULL;
}
}
//清空HashTable
res.RemoveAll();
//釋放result
if(result!=NULL)
{
mysql_free_result(result);
}
result=NULL;
}
//執行帶參數的SQL語句函數
BOOL MySql::ExecutePrepare(char * sql)
{
BOOL bRet=TRUE;
do
{
//初始化句柄
myStmt=mysql_stmt_init(&myData);
if (!myStmt)
{
bRet=FALSE;
break;
}
//準備SQL
if (mysql_stmt_prepare(myStmt, sql, strlen(sql)))
{
bRet=FALSE;
break;
}
}while(0);
return bRet;
}
BOOL MySql::BindParam(MYSQL_BIND * bind)
{
BOOL bRet=TRUE;
if (mysql_stmt_bind_param(myStmt, bind))
{
bRet=FALSE;
}
return bRet;
}
unsigned MySql::Execute()
{
unsigned uRet=0;
do
{
if (mysql_stmt_execute(myStmt))
{
uRet=0;
break;
}
//獲得受影響的行數
uRet=(unsigned)mysql_stmt_affected_rows(myStmt);
}while(0);
return uRet;
}
BOOL MySql::ClosePrepare()
{
BOOL bRet=TRUE;
//關閉句柄
if (mysql_stmt_close(myStmt))
{
bRet=FALSE;
}
return bRet;
}
//改變用戶
BOOL MySql::ChangeUser(char * name,char *pwd,char *db)
{
BOOL bRet=TRUE;
//如果失敗,返回FALSE
if(mysql_change_user(&myData, name, pwd, db) )
{
bRet=FALSE;
}
return bRet;
}
//選擇數據庫
BOOL MySql::SelectDB(char * db)
{
BOOL bRet=TRUE;
if(mysql_select_db(&myData, db))
{
bRet=FALSE;
}
return bRet;
}
//關閉
void MySql::Close()
{
//清空結果集
FreeResult();
//關閉連接
mysql_close(&myData);
}
//獲取查詢的值
int MySql::GetIntValue(int row, char * fd_name)
{
PROWS rows=NULL;
int len=0;
int iRet=0;
char * tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
//獲得數據的字符串表示
tmp=(char *)rows->fields[i].filed_value;
//轉換成數字
iRet=atoi(tmp);
break;
}
}
return iRet;
}
int MySql::GetIntValue(int row, int fd_num)
{
PROWS rows=NULL;
int len=0,iRet=0;
char * tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//獲得數字的字符串表示
tmp=(char *)rows->fields[fd_num].filed_value;
//轉換成數字
iRet=atoi(tmp);
return iRet;
}
//獲得符點型值
float MySql::GetFloatValue(int row,char * fd_name)
{
PROWS rows=NULL;
int len=0;
char * tmp=NULL;
float iRet=0.0;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
tmp=(char *)rows->fields[i].filed_value;
iRet=(float)atof(tmp);
break;
}
}
return iRet;
}
float MySql::GetFloatValue(int row,int fd_num)
{
PROWS rows=NULL;
int len=0;
float iRet=0.0;
char * tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
tmp=(char *)rows->fields[fd_num].filed_value;
iRet=(float)atof(tmp);
return iRet;
}
//獲得高精度符點型值
double MySql::GetDoubleValue(int row,char * fd_name)
{
PROWS rows=NULL;
int len=0;
char * tmp=NULL;
double iRet=0.0;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
tmp=(char *)rows->fields[i].filed_value;
iRet=atof(tmp);
break;
}
}
return iRet;
}
double MySql::GetDoubleValue(int row,int fd_num)
{
PROWS rows=NULL;
int len=0;
char * tmp=NULL;
double iRet=0.0;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
tmp=(char *)rows->fields[fd_num].filed_value;
iRet=atof(tmp);
return iRet;
}
//獲得布爾型值
BOOL MySql::GetBoolValue(int row,char * fd_name)
{
PROWS rows=NULL;
int len=0;
char * tmp=NULL;
BOOL iRet=0;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
tmp=(char *)rows->fields[i].filed_value;
iRet=(BOOL)atoi(tmp);
break;
}
}
return iRet;
}
BOOL MySql::GetBoolValue(int row,int fd_num)
{
PROWS rows=NULL;
int len=0;
BOOL iRet=0;
char * tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
tmp=(char *)rows->fields[fd_num].filed_value;
iRet=(BOOL)atoi(tmp);
return iRet;
}
char * MySql::GetStringValue(int row,char * fd_name,unsigned * length)
{
PROWS rows=NULL;
int len=0;
char *p_Tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
*length=(unsigned)(rows->fields[i].value_len);
p_Tmp=(char *)(rows->fields[i].filed_value);
break;
}
}
return p_Tmp;
}
char * MySql::GetStringValue(int row,int fd_num, unsigned * length)
{
PROWS rows=NULL;
int len=0;
char * p_Tmp=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//獲得列長度
*length=(unsigned)rows->fields[fd_num].value_len;
//直接返回此列的值
p_Tmp=(char *)(rows->fields[fd_num].filed_value);
return p_Tmp;
}
//獲得日期時間型數據
char * MySql::GetDataTimeValue(int row,char * fd_name)
{
PROWS rows=NULL;
int len=0;
char * pTime=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return NULL;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
pTime=(char *)(rows->fields[i].filed_value);
break;
}
}
return pTime;
}
char * MySql::GetDataTimeValue(int row, int fd_num)
{
PROWS rows=NULL;
int len=0;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return NULL;
rows=(PROWS)res[row];
//直接返回此列的值
return (char *)(rows->fields[fd_num].filed_value);
}
//獲得二進制數據的緩沖區
int MySql::GetBinaryValue(int row,char * fd_name,char * pBuf)
{
PROWS rows=NULL;
int len=0;
char * p=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return 0;
rows=(PROWS)res[row];
//查找列
for(int i=0;i<rows->cnt;i++)
{
if(!strcmp(rows->fields[i].field_name,fd_name))
{
len=(int)rows->fields[i].value_len;
if(pBuf==NULL)
break;
p=(char *)(rows->fields[i].filed_value);
memcpy(pBuf,p,len);
break;
}
}
return len;
}
int MySql::GetBinaryValue(int row,int fd_num,char * pBuf)
{
PROWS rows=NULL;
int len=0;
char * p=NULL;
len=res.GetCount();
//如果行號超過了范圍,則返回0
if(row>=len)return NULL;
rows=(PROWS)res[row];
len=rows->fields[fd_num].value_len;
if(pBuf==NULL)
return len;
//直接返回此列的值
p=(char *)(rows->fields[fd_num].filed_value);
memcpy(pBuf,p,len);
return len;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -