56,677
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mysql.h"
class BaseStmt
{
public:
BaseStmt();
~BaseStmt();
/*
0 , Success ;
CR_COMMANDS_OUT_OF_SYNC 以不恰当的顺序执行了命令 ;
CR_OUT_OF_MEMORY 内存溢出 ;
CR_SERVER_GONE_ERROR MySQL服务器不可用 ;
CR_SERVER_LOST 查询过程中,与服务器的连接丢失 ;
CR_UNKNOWN_ERROR 出现未知错误 ;
*/
int Prepare(const char *query, unsigned long length);
// nParamPos , nParam, nType, columType, columSize*, nParamSize
int BindIn(int nParamPos,char *szParam, long unsigned int nParamLength, long unsigned int nResLength);
int BindOut(int nResPos, char *szRes, long unsigned int nBufLength, long unsigned int nResLength);
int Excute();
int Fetch();
private:
int m_nBindInParamCounts;
int m_nBindOutResultColumCounts;
int m_nCheckParam;
int m_nCheckResultColum;
MYSQL m_mysql;
MYSQL_STMT *m_pStmt;
MYSQL_RES *m_pPrepare_meta_result;
MYSQL_BIND *m_pBindIn;
MYSQL_BIND *m_pBindOut;
char m_szSql[128];
};
#include "BaseStmt.h"
using namespace std;
BaseStmt::BaseStmt()
{
m_nBindInParamCounts =0;
m_nBindOutResultColumCounts =0;
m_nCheckParam =0;
m_nCheckResultColum =0;
m_pStmt =NULL;
m_pPrepare_meta_result =NULL;
m_pBindIn =NULL;
m_pBindOut =NULL;
memset(m_szSql,0,sizeof(m_szSql));
mysql_init(&m_mysql);
mysql_options(&m_mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&m_mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
if (!mysql_real_connect(&m_mysql,NULL,"root","love5228","test",0,NULL,0))
{
printf("Failed to connect to database: Error: %s\n",mysql_error(&m_mysql));
}
else
{
printf("Connect Success\n");
}
};
BaseStmt::~BaseStmt()
{
if(NULL != m_pBindIn)
{
delete(m_pBindIn);
}
if(NULL != m_pBindOut)
{
delete(m_pBindOut);
}
if(mysql_stmt_close(m_pStmt))
{
fprintf(stderr, " failed while closing the statement\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
mysql_close(&m_mysql);
};
int BaseStmt::Prepare(const char *query, unsigned long length)
{
m_pStmt = mysql_stmt_init(&m_mysql);
if(NULL == m_pStmt)
{
fprintf(stderr, " mysql_stmt_init(), out of memory\n");
exit(0);
}
int nRetNote = 0;
sprintf(m_szSql,"%s",query);
if(mysql_stmt_prepare(m_pStmt, m_szSql, length))
{
fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
//get the ParamCounts
m_nBindInParamCounts = mysql_stmt_param_count(m_pStmt);//when ParamCounts = 0 . the Params is NULL
printf("m_nBindInParamCounts: %d\n",m_nBindInParamCounts);
//get the prepare_meta_result
m_pPrepare_meta_result= mysql_stmt_result_metadata(m_pStmt);
if(m_pPrepare_meta_result == NULL)
{
fprintf(stderr,"MYSQL_RES:prepare_meta_result is NULL \n");
exit(0);
}
//get the ResultParamCount
m_nBindOutResultColumCounts= mysql_num_fields(m_pPrepare_meta_result);
printf("m_nBindOutResultColumCounts: %d\n",m_nBindOutResultColumCounts);
//new BindIn
if(0 !=m_nBindInParamCounts)
{
m_pBindIn =new(std::nothrow) MYSQL_BIND[m_nBindInParamCounts];
if(NULL == m_pBindIn)
{
fprintf(stderr,"m_pBindIn new memory failure \n");
exit(0);
}
memset(m_pBindIn,0,sizeof(MYSQL_BIND)*m_nBindInParamCounts);
}
//new BindOut
if(0 !=m_nBindOutResultColumCounts)
{
m_pBindOut =new(std::nothrow) MYSQL_BIND[m_nBindOutResultColumCounts];
if(NULL == m_pBindOut)
{
fprintf(stderr,"m_pBindOut new memory failure \n");
exit(0);
}
memset(m_pBindOut,0,sizeof(MYSQL_BIND)*m_nBindOutResultColumCounts);
}
return nRetNote;
}
int BaseStmt::BindIn(int nParamPos,char *szParam, long unsigned int nParamLength, long unsigned int nResLength)
{
m_pBindIn[nParamPos-1].buffer_type= MYSQL_TYPE_STRING;//buffer_type指明了与语句参数捆绑的值类型。对于输出,它指明了你希望从结果缓冲收到的值类型。
m_pBindIn[nParamPos-1].buffer= (char*)(szParam);
m_pBindIn[nParamPos-1].buffer_length= nParamLength;//buffer_length值指定了与mysql_stmt_bind_param()一起使用时的*buffer长度,或与mysql_stmt_bind_result()一起使用时能够提取到缓冲区内的最大数据。它指明了可保存在缓冲区内的最大数据
m_pBindIn[nParamPos-1].is_null= 0;
m_pBindIn[nParamPos-1].length= &nResLength;//对于输入参数数据绑定,“length”指向unsigned long变量,该变量指明了存储在*buffer中参数值的长度,供mysql_stmt_execute()使用。该变量指明了存储在*buffer中数据的实际字节数
m_nCheckParam++;
printf("BindIn(int nParamPos:%d,char *szParam:%s, long unsigned int nParamLength:%d) , m_nCheckParam :%d\n",nParamPos,szParam,nParamLength,m_nCheckParam);
return 0;
}
int BaseStmt::BindOut(int nResPos, char *szRes, long unsigned int nBufLength, long unsigned int nResLength)
{
m_pBindOut[nResPos-1].buffer_type= MYSQL_TYPE_STRING;//buffer_type指明了与语句参数捆绑的值类型。对于输出,它指明了你希望从结果缓冲收到的值类型。
m_pBindOut[nResPos-1].buffer= (char *)szRes;
m_pBindOut[nResPos-1].buffer_length= nBufLength;//buffer_length值指定了与mysql_stmt_bind_param()一起使用时的*buffer长度,或与mysql_stmt_bind_result()一起使用时能够提取到缓冲区内的最大数据。它指明了可保存在缓冲区内的最大数据
m_pBindOut[nResPos-1].is_null= 0;
m_pBindOut[nResPos-1].length= &nResLength;//对于输入参数数据绑定,“length”指向unsigned long变量,该变量指明了存储在*buffer中参数值的长度,供mysql_stmt_execute()使用。该变量指明了存储在*buffer中数据的实际字节数
m_nCheckResultColum++;
printf("BindOut(int nResPos:%d, char *szRes:%s, long unsigned int nResLength:%d) : m_nCheckResultColum :%d\n",nResPos,szRes,nResLength,m_nCheckResultColum);
return 0;
}
int BaseStmt::Excute()
{
if (mysql_stmt_bind_param(m_pStmt, m_pBindIn))
{
fprintf(stderr, " mysql_stmt_bind_param() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
printf("m_pBindIn[0].buffer: %s\n , m_pBindOut[0].buffer_length: %d",m_pBindIn[0].buffer,m_pBindOut[0].buffer_length);
if (mysql_stmt_bind_result(m_pStmt, m_pBindOut))
{
fprintf(stderr, " mysql_stmt_bind_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
if (mysql_stmt_execute(m_pStmt))
{
fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
if(m_nCheckParam != m_nBindInParamCounts)
{
fprintf(stderr, " mysql_stmt_bind_param_counts failed\n");
exit(0);
}
if(m_nCheckResultColum != m_nBindOutResultColumCounts)
{
fprintf(stderr, " mysql_stmt_bind_result_colum_counts failed\n");
exit(0);
}
/*Now buffer all results to client*/
if (mysql_stmt_store_result(m_pStmt))
{
fprintf(stderr, " mysql_stmt_store_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
exit(0);
}
printf(" Number of rows: %lu\n",(long unsigned)mysql_stmt_num_rows(m_pStmt));
return 0;
}
int BaseStmt::Fetch()
{
int nRetNote = 0;
printf("begin fetch\n");
nRetNote = mysql_stmt_fetch(m_pStmt);
fprintf(stderr, " %s\n", mysql_stmt_error(m_pStmt));
return nRetNote;
}
#include <string.h>
#include <stdio.h>
#include "BaseStmt.h"
using namespace std;
#define SAMPLE "select name,sex from connect where name = ? "
int main()
{
int nRetNote = 0;
BaseStmt *pStmt = new(std::nothrow) BaseStmt;
if(NULL == pStmt)
{
fprintf(stderr,"new failure error\n");
return 0;
}
nRetNote = pStmt->Prepare(SAMPLE,strlen(SAMPLE));
printf("Prepare successful\n");
char szResName[21] ={0};
char szResSex[4] ={0};
char szParamName[21] ={0};
sprintf(szParamName,"%s","zhangchunji");
long unsigned int nResLength = 0;
printf("szParamName: %s; sizeof(szParamName):%d; strlen(szParamName)%d;\n",szParamName,sizeof(szParamName),strlen(szParamName));
pStmt->BindIn(1,szParamName,sizeof(szParamName),strlen(szParamName));
pStmt->BindOut(1,szResName,sizeof(szResName),nResLength);
pStmt->BindOut(2,szResSex,sizeof(szResSex),nResLength);
pStmt->Excute();
printf("Excute() suceessful\n");
while(!pStmt->Fetch())
{
printf("Name: %s ; szResSex: %s \n", szResName,szResSex);
}
return 0;
}
实现代码在此.