mysql connect query

mysql连接与查询

函数 描述 返回值
MYSQL *mysql_init(MYSQL *mysql) 分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。 初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg) 可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。arg是对应option的一个值 成功时返回0。如果使用了未知选项,返回非0值。
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) 返回由服务器上的数据库名称组成的结果集,该服务器与由通配符参数指定的简单正则表达式匹配。通配符参数可以包含通配符“%”或“_”,也可以是NULL指针,以便与所有的数据库匹配。调用mysql_list_dbs()的方法类似于执行查询SHOW database [LIKE wild]。 成功后返回MYSQL_RES结果集。如果出现错误,返回NULL。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) 执行由“query”指向的SQL查询,对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查。如果是query是多条sql语句,mysql_real_query()只会执行第一条语句,需要调用while( !mysql_next_result( mysql ) );把后面语句执行完。 如果查询成功,返回0。如果出现错误,返回非0值。
MYSQL_RES *mysql_store_result(MYSQL *mysql) 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集。如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。一旦完成了对结果集的操作,必须调用mysql_free_result()。 具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL
int mysql_next_result(MYSQL *mysql) 如果存在多个查询结果,mysql_next_result()将读取下一个查询结果,并将状态返回给应用程序。如果前面的查询返回了结果集,必须为其调用mysql_free_result()。调用了mysql_next_result()后,连接状态就像你已为下一查询调用了mysql_real_query()或mysql_query()时的一样。这意味着你能调用mysql_store_result()、mysql_warning_count()、mysql_affected_rows()等等。 0 成功并有多个结果。-1 成功但没有多个结果 >0 出错
unsigned int mysql_field_count(MYSQL *mysql) 返回作用在连接上的最近查询的应该返回的列数。该函数的正常使用是在mysql_store_result()返回NULL(因而没有结果集指针)时。在这种情况下,可调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果。 表示结果集中列数的无符号整数。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。 下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。typedef char **MYSQL_ROW;
unsigned long *mysql_fetch_lengths(MYSQL_RES *result) 返回结果集内当前行的列的长度。如果打算复制字段值,该长度信息有助于优化,这是因为,你能避免调用strlen()。此外,如果结果集包含二进制数据,必须使用该函数来确定数据的大小,原因在于,对于包含Null字符的任何字段,strlen()将返回错误的结果。 无符号长整数的数组表示各列的大小(不包括任何终结NULL字符)。如果出现错误,返回NULL。

bool MysqlConnect(MYSQL &mysql,const char *szIP,const char *szUserName,
                  const char *szPassword,const char *szDBName)
{
    if( mysql_init(&mysql) == NULL )
    {
        return false;
    }
    mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"gbk");
    if (mysql_real_connect(&mysql,szIP,szUserName,szPassword,szDBName,0,NULL,CLIENT_MULTI_STATEMENTS) == NULL)
    {
        if( mysql_errno( &mysql ) )
        {
            printf( "connect error %d: %s\n", mysql_errno( &mysql ), mysql_error( &mysql ) );
            return false;
        }
        return false;
    }
}


void AnalyzeResult(MYSQL_RES *pRes)
{
    if (!pRes)
    {
        return;
    }

    do 
    {
        MYSQL_ROW       pRow            = mysql_fetch_row( pRes );
        unsigned long   *pColSize   = mysql_fetch_lengths( pRes );
        if( pRow && pColSize )
        {
            char    szValue[64] = {0};
            char    *pRetData               = pRow[0];
            int     nResult             = pColSize[0];

            if( nResult < sizeof(szValue) )
            {
                memcpy( szValue, pRetData, nResult );
                szValue[nResult]    = 0;
                ////----处理结果-----
                printf("key:%s\n",szValue);
            }
        }
        else
        {
            break;
        }
    } while (true); 
}


bool test_mysql_query()
{
    MYSQL mysql;
    const char *db = "DBName";
    MysqlConnect(mysql,"127.0.0.1","root","",db);
    const char *pSql = "select keyname from tablename;";
    MYSQL_RES *pResTemp;
    bool bExist = FALSE;
    if( NULL != ( pResTemp = mysql_list_dbs( &mysql, db ) ) )
    {
        if( mysql_num_rows( pResTemp ) > 0 )
        {
            bExist = TRUE;
        }
        mysql_free_result( pResTemp );
    }
    if (bExist)
    {
        if (mysql_select_db( &mysql, db ))
        {
            if( mysql_errno( &mysql ) )
            {
                printf( "select db error %d: %s\n", mysql_errno( &mysql ), mysql_error( &mysql ) );
                return false;
            }
        }
        if (mysql_real_query( &mysql, pSql, strlen(pSql)+1))
        {
            if( mysql_errno( &mysql ) )
            {
                printf( "query error %d: %s\n", mysql_errno( &mysql ), mysql_error( &mysql ) );
                return false;
            }
        }
        MYSQL_RES *pRes = NULL;
        do 
        {
            pRes = mysql_store_result( &mysql );
            AnalyzeResult(pRes);
            mysql_free_result( pRes );
        }while( !mysql_next_result( &mysql ) );

        return true;
    }
    return false;
}

int main()
{
    test_mysql_query();
}

你可能感兴趣的:(mysql,mysql)