Linux下用c连接远程mysql,直接在主函数实现那种奶粉没有问题题,但是我把代码写在子函数后执行为什么会出现问题?

我的mysql的怎么ctrl+c用不了,我也看了,设置里的快捷键没问题呀_mysql吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:8,131贴子:
我的mysql的怎么ctrl+c用不了,我也看了,设置里的快捷键没问题呀收藏
我的mysql的怎么ctrl+c用不了,我也看了,设置里的快捷键没问题呀
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或vc中ado方法连接远程mysql,开发机没问题,release版本到未装mysql的机器上运行提示:未发现数据源名称并且未指定默认驱动程序
[问题点数:50分,结帖人minglingji]
vc中ado方法连接远程mysql,开发机没问题,release版本到未装mysql的机器上运行提示:未发现数据源名称并且未指定默认驱动程序
[问题点数:50分,结帖人minglingji]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
2009年6月 总版技术专家分月排行榜第三2009年2月 总版技术专家分月排行榜第三2005年4月 总版技术专家分月排行榜第三2005年1月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。1026人阅读
1. 初始化一个连接句柄&&& MYSQL *mysql_init(MYSQL *);&&& 正确:返回一个指向新分配的链接句柄结构的指针&&& 错误:NULL&&& 注:该函数的传入参数通常为NULL即可。
2. 建立物理连接&&& MYSQL *mysql_real_connect(MYSQL *connection,&const char *server_host,&const char *sql_user_name,&const char *sql_password,&const char *db_name,&unsigned int port_number,&const char *unix_socket_name,&unsigned int flags);&&& 其中connection参数为通过mysql_init函数创建的句柄,server_host参数可为主机名或IP值,如果连到本机,我们仅仅只需指定&localhost&即可。sql_user_name和sql_password即为访问数据库的用户名和密码,如果sql_user_name为空,那么默认为当前Linux user的用户名,如果sql_password为空,那么只能访问不需要密码的数据。密码在经网络传输之前都经过加密处理。通常情况下,如果你没有改变MySQL的默认安装,port_number和*unix_socket_name的值分别为0和NULL即可,他们默认为当前相应值。flags参数允许我们改变当前使用协议的特性,默认情况下,置0即可。&&& 如果连接不成功,该函数返回NULL
3. 断开连接&&& void mysql_close(MYSQL *connection);&&& 使用该函数可以断开指定的链接。不让不需要的连接断开会浪费资源,但重新建立连接需要额外开销,在实际工作中我们可根据需要权衡。
4. 选项设置&&& int mysql_options(MYSQL *connection, enum option_to_set,&const char *argument);&&& 该函数可用在mysql_init和mysql_real_connect之间来设置一些连接选项,option_to_set参数如MYSQL_OPT_CONNECT_TIMEOUT用来设置连接超时的时间(秒),MYSQL_OPT_COMPRESS表示在网络传输中对数据进行压缩,而MYSQL_INIT_COMMAND指定每当连接建立时用来发送的命令。&&& 函数成功时返回0,因为该函数仅仅用来设置选项,所以失败意味着使用了无效的选项。此外,该函数每次只能设置一种选项,所以每设置一个选项就必须调用该函数一次。&& 举例:&& unsigned int timeout = 7;&& connection = mysql_init(NULL);&& ret = mysql_options(connection, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);&& if (ret) {&/* Handle error */&...&&& }&&& connection = mysql_real_connect(connection ...
5. 错误处理&&&&&&& unsigned int mysql_errno(MYSQL *connection);&&&&&&& char *mysql_error(MYSQL *connection);&&& 错误代码为非0值&&& 举例:&&&&&&& if (mysql_errno(&my_connection)) {&&&&&&&&&&&& fprintf(stderr, &Connection error %d: %s/n&, mysql_errno(&my_connection),&&&&&&&&&&&&&&&&&&&&&&&& mysql_error(&my_connection));
6. 执行SQL命令&&&&&&&& int mysql_query(MYSQL *connection, const char *query)&&& 该函数用来执行SQL命令,如果执行成功则返回0。如果涉及二进制数据,可使用mysql_real_query这个函数
&&&&&&& my_ulonglong mysql_affected_rows(MYSQL *connection);&&& 该函数返回被update,insert,delete等查询命令影响的行数,返回值为unsigned Long(使用printf时需使用&lu"格式。当使用update命令时,该函数返回实际影响的行,而不是与where语句的匹配值(有些行已经是我们需要的那样,所以无需update)。如果我们希望该函数update的返回值与我们希望的那样,我们需要在mysql_real_connect函数中使用CLIENT_FOUND_ROWS flag,如&&&&&&& if (mysql_real_connect(&my_connection, &localhost&,&&rick&, &secret&, &foo&, 0, NULL, CLIENT_FOUND_ROWS)) {&&& 此外,当我们使用delete命令删除整个表时,此函数返回0。&&& MySQL提供了LAST_INSERT_ID()函数来获取上次插入操作AUTO_INCREMENT列的数值,如SELECT LAST_INSERT_ID();即可在mysql_query函数中使用该语句。&& 举例:&&&&&&& res = mysql_query(&my_connection, &SELECT LAST_INSERT_ID()&);&&&&&& if (res) {&&&&&&&&&&& printf(&SELECT error: %s/n&, mysql_error(&my_connection));&&&&&&& } else {&&&&&& res_ptr = mysql_use_result(&my_connection);&&&&& if (res_ptr) {&&&&&&&&&& while ((sqlrow = mysql_fetch_row(res_ptr))) {&&&&&&&&&&&&&&&& printf(&We inserted childno %s/n&, sqlrow[0]);&&&&&&&&&&& }&&&&&& mysql_free_result(res_ptr);&&&&&& }
7. 数据控制&&&&&&& MYSQL_RES *mysql_store_result(MYSQL *connection);&&& 该函数成功时返回一个指向返回集的指针,否则返回NULL。
&&&&&&& my_ulonglong mysql_num_rows(MYSQL_RES *result);&&&& 该函数获取返回集中的行数,若为0表示没有返回行。
&&&&&&& MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);&&& 该函数从mysql_store_result返回集中取出一行,当没有数据或者出差时返回NULL
&&&&&&& void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);&&& 该函数用于设置下一个被mysql_fetch_row取出的行,offset的值在0到rownum-1之间,当offset的值为0时,下一次用mysql_fetch_row取出的行就是返回集中的第一行。
&&&&&&& MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);&&& 该函数用于获取返回集中当前指针的位置,并不是行数,所以不能与mysql_data_seek函数一 起使用&&&&&& &&&&&&&& MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);&&& 该函数用于移动返回集中指针的位置并返回先前的位置
&&&&&& void mysql_free_result(MYSQL_RES *result);&&& 该函数用于释放返回集。
&&&&&&& MYSQL_RES *mysql_use_result(MYSQL *connection);&&& 该函数并不像mysql_store_result那样将数据存储到返回集中,而是返回一个返回集对象指针,所以你必须返回使用mysql_fetch_row取回数据,这对于大的数据集来说可以减少客户端的存储空间。此外,先前的mysql_data_seek,mysql_row_tell,mysql_row_seek也不能在此使用,mysql_num_rows函数只有在所有数据都被检索出后才能为我所用。
8. 数据处理&unsigned int mysql_field_count(MYSQL *connection);&&& 通常,该函数获取返回集中数据的列数。此外,我们还可以将该函数用于其它情况,比如说确定mysql_store_result函数失败的原因;如果mysql_store_result返回NULL,而mysql_filed_count返回了一个大于0的数,说明是检索错误,但如果mysql_field_count返回0,则表明为存储错误。
&&&&&&& MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);&&& 该函数可获得与列字段相关信息的结构指针,包括如下等字段&&&&&&& char& *name&&&列的名字&&&&&&& char& *table&&&该列的表名,用于多表查询&&&&&&& enum enum_field_types type&列的类型&&&&&&& unsigned int length&&列的宽度&&&&&&& unsigned int max_&&mysql_store_result返回集中列的最大长度字节&&&&&&&&&列的定义,包括NOT_NULL_FLAG, PRI_KEY_FLAG,&&&&UNSIGNED_FLAG, AUTO_INCREMENT_FLAG, and&&&&BINARY_FLAG.&&&&&&& u&&小数点后的位数
&&& 常用的type有:&FIELD_TYPE_DECIMAL&FIELD_TYPE_LONG&FIELD_TYPE_STRING&FIELD_TYPE_VAR_STRING&&& 宏IS_NUM当参数字段为数字类型的时候返回TRUE,如&if (IS_NUM(myslq_field_ptr-&type)) printf(&Numeric type field/n&);
&&&&&&&&&&& MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,&&MYSQL_FIELD_OFFSET offset);&&& 设置mysql_fetch_field下一次取出列的位置,如果offset为0,下次将会取出第一列。
9. 获取系统信息&&&& char *mysql_get_client_info(void);&&返回客户端库文件的版本&&&& char *mysql_get_host_info(MYSQL *connection); 返回服务器连接信息&&&& char *mysql_get_server_info(MYSQL *connection);返回当前连接的服务器的信息&&&& char *mysql_info(MYSQL*connection);.&&返回最近一次执行的query的信息,但只对update和&&&&&insert有效&&&& int mysql_select_db(MYSQL *connection,const char *dbname);改变当前连接的数据库,成功后返回0&&&& int mysql_shutdown(MYSQL *connection);&关闭数据库服务器,成功后返回0,前提是你有改&&&&&权限。
10. 一个实例&&& #include &stdlib.h&&&& #include &stdio.h&&&& #include &mysql.h&&&& MYSQL my_&&& MYSQL_RES *res_
&&& MYSQL_ROW
&&& void display_header();&&& void display_row();
&&& int main(int argc, char *argv[]) {&&int first_row = 1;&mysql_init(&my_connection);&if (mysql_real_connect(&my_connection, &localhost&, &rick&,&&&bar&, &rick&, 0, NULL, 0)) {&printf(&Connection success/n&);&res = mysql_query(&my_connection, &SELECT childno, fname,&&age FROM children WHERE age & 5&);&if (res) {&&fprintf(stderr, &SELECT error: %s/n&, mysql_error(&my_connection));&} else {&&res_ptr = mysql_use_result(&my_connection);&&if (res_ptr) {&&display_header();&&while ((sqlrow = mysql_fetch_row(res_ptr))) {&&&if (first_row) {&&&display_header();&&&first_row = 0;&&}&&display_row();&&&& }&&&& if (mysql_errno(&my_connection)) {&&&& fprintf(stderr, &Retrive error: %s/n&,&&&& mysql_error(&my_connection));&&&& }&}&mysql_free_result(res_ptr);&}&mysql_close(&my_connection);&} else {&fprintf(stderr, &Connection failed/n&);&if (mysql_errno(&my_connection)) {&&fprintf(stderr, &Connection error %d: %s/n&,&&mysql_errno(&my_connection),&&mysql_error(&my_connection));&&}&&&& }&return EXIT_SUCCESS;&&& }
&&& void display_header() &&& {&&& &MYSQL_FIELD *field_&printf(&Column details:/n&);&while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) {&printf(&/t Name: %s/n&, field_ptr-&name);&printf(&/t Type: &);&if (IS_NUM(field_ptr-&type)) {&&printf(&Numeric field/n&);&} else {&&switch(field_ptr-&type) {&&case FIELD_TYPE_VAR_STRING:&&printf(&VARCHAR/n&);&&&&case FIELD_TYPE_LONG:&&printf(&LONG/n&);&&&&default:&&printf(&Type is %d, check in mysql_com.h/n&, field_ptr-&type);&&} /* switch */&} /* else */&printf(&/t Max width %ld/n&, field_ptr-&length);&if (field_ptr-&flags & AUTO_INCREMENT_FLAG)&&printf(&/t Auto increments/n&);&&printf(&/n&);&&} /* while */&&& }
&&& void display_row()&&& {&unsigned int field_&field_count = 0;&while (field_count & mysql_field_count(&my_connection)) {&&if (sqlrow[field_count]) printf(&%s &, sqlrow[field_count]);&&else printf(&NULL&);&&field_count++;&}&printf(&/n&);&&& }
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80750次
排名:千里之外
转载:69篇
评论:13条
(1)(5)(18)(20)(1)(5)(2)(15)(7)MySQL连接数据库函数内存泄露解决方案_数据库技术_Linux公社-Linux系统门户网站
你好,游客
MySQL连接数据库函数内存泄露解决方案
来源:Linux社区&
作者:weihua1984
Linux 下使用C操作MySQL数据库时写个测试程序
int&main(void)&&
&&&&MYSQL&m_&&
&&&&mysql_init(&m_mysql);&&
&&&&const&char&pLocalhost[]&=&"localhost";&&
&&&&const&char&pUser[]&=&"root";&&
&&&&const&char&pPass[]&=&"123456";&&
&&&&const&char&pDB[]&=&"HTTPCONTROL";&&
&&&&if(mysql_real_connect(&m_mysql,pLocalhost,pUser,pPass,pDB,0,NULL,0)&==&NULL)&
//mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。
&&&&&&&&cout&&"connect&failed"&&&&
&&&&else&&
&&&&&&&&cout&&"connect&success"&&&&
&&&&mysql_close(&m_mysql);&&&&&&
&&&&return&0;&&
编译后使用valgrind检测内存泄露
[root@localhost string]# valgrind --tool=memcheck --leak-check=full ./mysql&==10352== Memcheck, a memory error detector==10352== Copyright (C) , and GNU GPL'd, by Julian Seward et al.==10352== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info==10352== Command: ./mysql==10352==&connect success==10352==&==10352== HEAP SUMMARY:==10352==&&&& in use at exit: 61,336 bytes in 16 blocks==10352==&& total heap usage: 118 allocs, 102 frees, 115,929 bytes allocated==10352==&==10352== 24,528 bytes in 6 blocks are possibly lost in loss record 4 of 5==10352==&&& at 0x4005903: malloc (vg_replace_malloc.c:195)==10352==&&& by 0x30DD75: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30E59C: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30EF96: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30F111: get_charset_by_csname (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x32C3D2: mysql_init_character_set (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x32DABB: mysql_real_connect (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x8048A76: main (str.cpp:32)==10352==&==10352== 28,616 bytes in 7 blocks are possibly lost in loss record 5 of 5==10352==&&& at 0x4005903: malloc (vg_replace_malloc.c:195)==10352==&&& by 0x30DD75: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30E57A: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30EF96: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x30F111: get_charset_by_csname (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x32C3D2: mysql_init_character_set (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x32DABB: mysql_real_connect (in /usr/lib/mysql/libmysqlclient.so.15.0.0)==10352==&&& by 0x8048A76: main (str.cpp:32)==10352==&==10352== LEAK SUMMARY:==10352==&&& definitely lost: 0 bytes in 0 blocks==10352==&&& indirectly lost: 0 bytes in 0 blocks==10352==&&&&& possibly lost: 53,144 bytes in 13 blocks==10352==&&& still reachable: 8,192 bytes in 3 blocks==10352==&&&&&&&& suppressed: 0 bytes in 0 blocks==10352== Reachable blocks (those to which a pointer was found) are not shown.==10352== To see them, rerun with: --leak-check=full --show-reachable=yes==10352==&==10352== For counts of detected and suppressed errors, rerun with: -v==10352== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 3
2、解决措施
简单的说是在断开数据库连接后使用
mysql_library_end()
关闭MYSQL 使用的库即在mysql_close(。。。)后添加mysql_library_end()就ok了
再添加一句,在使用mysql API之前最好是调用mysql_library_init(。。。。)
相关资讯 & & &
& (04/14/:38)
& (11/02/:36)
& (10/09/:08)
& (01/29/:40)
& (10/15/:40)
& (10/07/:48)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 那种奶粉没有问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信