绑定不了自己的数据,各位帮忙看看

仙境之桥2046 2013-04-18 02:21:22
绑定不了自己的数据,很蛋疼,求对mysql C 了解的给跑下看看,找下bug.

如果解决,将在开贴追加分数,多谢各位了

头文件

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


}








...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
自己搞定了 , 哇哈哈
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
引用 7 楼 wwwwb 的回复:
检查SQL语句内容是什么,特别是传入的参数是什么,逐步调试
是有那些安装包没有装吗?
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
引用 6 楼 rucypli 的回复:
那lz慢慢单步调试吧
gdb 跟进去了,但是想进入某些函数的时候,结果就出现 2531 in /pb2/build/sb_0-8179570-1358877568.77/rpm/BUILD/mysql-5.6.10/mysql-5.6.10/libmysql/libmysql.c 此类东西,请问知道是怎么一回事情吗?
wwwwb 2013-04-18
  • 打赏
  • 举报
回复
检查SQL语句内容是什么,特别是传入的参数是什么,逐步调试
rucypli 2013-04-18
  • 打赏
  • 举报
回复
那lz慢慢单步调试吧
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
引用 3 楼 wwwwb 的回复:
检查SQL语句内容是什么,在MYSQL中运行,看看有无结果
查过了,我在mysql中执行时有结果的,并且绑定BindIn[].buffer也是有数据的,就是在查询的时候,affect_row显示竟然是0行. 现在想具体定位下,在执行的时候执行的sql是什么.....
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
我在mysql中执行时有结果的,并且绑定BindIn[].buffer也是有数据的,就是在查询的时候,affect_row显示竟然是0行.
wwwwb 2013-04-18
  • 打赏
  • 举报
回复
检查SQL语句内容是什么,在MYSQL中运行,看看有无结果
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
#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;
}
实现代码在此.
仙境之桥2046 2013-04-18
  • 打赏
  • 举报
回复
自己个自己个说明再,绑定上的输入参数,成功了,但是到却得不到数据.

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧