绑定不了自己的数据,很蛋疼,求对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;

  
}
MySQL

解决方案 »

  1.   

    #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;
    }实现代码在此.
      

  2.   

    检查SQL语句内容是什么,在MYSQL中运行,看看有无结果
      

  3.   

    我在mysql中执行时有结果的,并且绑定BindIn[].buffer也是有数据的,就是在查询的时候,affect_row显示竟然是0行.
      

  4.   


    查过了,我在mysql中执行时有结果的,并且绑定BindIn[].buffer也是有数据的,就是在查询的时候,affect_row显示竟然是0行.现在想具体定位下,在执行的时候执行的sql是什么.....
      

  5.   

    检查SQL语句内容是什么,特别是传入的参数是什么,逐步调试
      

  6.   


    gdb 跟进去了,但是想进入某些函数的时候,结果就出现2531 in /pb2/build/sb_0-8179570-1358877568.77/rpm/BUILD/mysql-5.6.10/mysql-5.6.10/libmysql/libmysql.c此类东西,请问知道是怎么一回事情吗?