您的位置:首页 > 数据库 > MySQL

使用MySQL提供的C接口访问mysql数据库

2017-03-28 18:26 471 查看
以前使用过mysql提供的C接口访问mysql数据库,没有出现过问题。就“别出心裁”想写出更漂亮的代码,如下:

static MYSQL *p_conn=NULL;
static MYSQL_RES *p_result=NULL;

int main (int argc, char *argv[])
{
mysql_init(p_conn);

if( NULL==mysql_real_connect(p_conn, "localhost", "root", "*****", "*****", 0, NULL, 0) )
{
printf("error %u: %s\n", mysql_errno(p_conn), mysql_error(p_conn));
}

if( mysql_query(p_conn, "select * from online_dev") )
{
printf("error %u: %s\n", mysql_errno(p_conn), mysql_error(p_conn));
}

while( NULL!=(row=mysql_fetch_row(p_result)) )
{
/********
********/
}

if( NULL!=p_result )
{
mysql_free_result(p_result);
p_result=NULL;
}
if( NULL!=p_conn )
{
mysql_close(p_conn);
p_conn=NULL;
}

return 0;
}
实际运行的时候会收到SIGSEGV信号,提示段错误。分析这段代码:

1、定义了一个代表mysql连接的指针,初始化为NULL;妄想通过mysql_init(p_conn)来申请一个MYSQL的内存空间,并让p_conn指向这个地址;根据p_conn是否为NULL判断该数据库连接是否断开,不为NULL就断开连接,并赋给p_conn NULL值。

2、连接数据库和执行sql语句都没有问题。

3、妄想通过mysql_fetch_row(p_result)不仅从服务器取得一行数据,而且分配一个存储结果集的内存空间,p_result也会从NULL变成非NULL;

再看看正确的代码:

static MYSQL conn;
static MYSQL_RES *p_result;

int main (int argc, char *argv[])
{
mysql_init(&conn);

if( NULL==mysql_real_connect(&conn, "localhost", "root", "*****", "*****", 0, NULL, 0) )
{
printf("error %u: %s\n", mysql_errno(&conn), mysql_error(&conn));
}

if( mysql_query(&conn, "select * from online_dev") )
{
printf("error %u: %s\n", mysql_errno(&conn), mysql_error(&conn));
}

p_result=mysql_use_result(&conn);
while( NULL!=(row=mysql_fetch_row(p_result)) )
{
/********
********/
}
mysql_free_result(p_result);

mysql_close(&conn);
return 0;
}
说明:

1、mysql_init()不会在内存中申请一个MYSQL结构,所以直接在栈里面定义一个,后续用&conn。

3、关于MYSQL_RES *p_result结果集指针,需要使用mysql_use_result()产生一个结果集(返回值是结果集指针),用完之后要用mysql_free_result()释放掉这块内存。
下面是一段关于这个问题mysql官网给出的解释:

After invoking mysql_query() you
must call mysql_use_result() for every statement that successfully produces a result set.
You must also call mysql_free_result() after you are done with the result set.

下面是mysql官网对C语言的API的在线手册地址,喜欢的同学多看看。

https://dev.mysql.com/doc/refman/5.7/en/c-api.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐