使用C语言访问MySQL数据 —— 连接和错误处理

 

使用C语言访问MySQL数据 —— 连接和错误处理

分类: GNU/Linux MySQL C/C++   1769人阅读  评论(0)  收藏  举报

2011-05-09 wcdj

 

 

可以通过许多不同的编程语言来访问MySQL,例如,C,C++,Java,Perl,Python,Tcl,PHP等。本文主要总结使用C语言接口如何访问MySQL数据。

(一) 连接例程
(二) 错误处理



(一) 连接例程

用C语言连接MySQL数据库包含两个步骤
(1) 初始化一个连接句柄结构。使用 mysql_init 来初始化连接句柄。
(2) 实际进行连接。使用 mysql_real_connect 来向一个连接提供参数。

其余步骤:
(3) 使用完连接之后,使用 mysql_close 关闭连接。
(4) mysql_options 用于设置选项。注意:仅能在 mysql_init 和 mysql_real_connect 之间调用。mysql_options 一次只能设置一个选项,所以每设置一个选项就得调用它一次。 

具体过程如下

登录mysql
$ mysql -u root -p
输入密码
创建一个本地用户wcdj
mysql> GRANT ALL ON *.* TO wcdj@localhost IDENTIFIED BY 'secretpassword';   (注意:最后的分号)
退出root用户
mysql> /q
Bye
登录新创建的用户wcdj
$ mysql -u wcdj --password=secretpassword
创建一个新的数据库newdatabase
mysql> CREATE DATABASE newdatabase;
退出wcdj用户
mysql> /q

编写 create_children.sql 文件,用于创建表和添加数据。

--
-- Create the table children
--

CREATE TABLE children (
    childno int(11) NOT NULL auto_increment,
    fname varchar(30),
    age int(11),
    PRIMARY KEY (childno)
);

--
-- Populate the table 'children'
--
INSERT INTO children(childno, fname, age) VALUES (1, 'wcdj', 21);
INSERT INTO children(childno, fname, age) VALUES (2, 'gerry', 22);
INSERT INTO children(childno, fname, age) VALUES (3, 'echo', 23);

登录mysql
$ mysql -u wcdj --password=secretpassword newdatabase   (注意,后面的newdatabase用于指定使用的数据库)
在新的数据库newdatabase中创建表children并添加数据:
mysql> /. create_children.sql
查看新添加的数据:
SELECT * from children;

1   wcdj    21
2   gerry   22
3   echo    23

connect1.c

 

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include "mysql.h"  
  4. int main()  
  5. {  
  6.     MYSQL *conn_ptr;  
  7.     conn_ptr = mysql_init(NULL);  
  8.     if(!conn_ptr)  
  9.     {  
  10.         fprintf(stderr, "mysql_init failed/n");  
  11.         return EXIT_FAILURE;  
  12.     }  
  13.     conn_ptr = mysql_real_connect(conn_ptr, "localhost""wcdj""123""newdatabase", 0, NULL, 0);  
  14.     if(conn_ptr)  
  15.     {  
  16.         printf("Connection success/n");  
  17.     }  
  18.     else  
  19.     {  
  20.         printf("Connection failed/n");  
  21.     }  
  22.     mysql_close(conn_ptr);  
  23.     return EXIT_SUCCESS;  
  24. }  

编译程序:
$ gcc -I/usr/include/mysql connect1.c -L/usr/lib/mysql -lmysqlclient -o connet1

测试:
$ ./connect1
Connection success
$

 

(二) 错误处理

(1) unsigned int mysql_errno(MYSQL *connection);    (错误码)
(2) char *mysql_error(MYSQL *connection);        (文本错误信息)    
可以通过调用 mysql_errno 并传递连接结构来获得错误码,它通常都是非0值。如果未设定错误码,它将返回0。
注意:因为每次调用库都会更新错误码,所以你只能得到最后一个执行命令的错误码。但是,上面列出的两个错误检查例程是例外,它们不会导致错误码的更新。
也可以调用 mysql_error ,来提供有意义的文本信息而不是单调的错误码。这些信息被写入一些内部静态内存空间中,所以如果想保存错误文本,你需要把它复制到别的地方。
注意:当调用 mysql_real_connect 时会遇到一个问题,因为它在失败时返回NULL指针,并没有提供一个错误码。但如果你将连接句柄作为一个变量,那么即使 mysql_real_connect 失败,你仍然能够处理它。

connect2.c
使用非动态分配的连接结构,以及编写一些基本的错误处理代码。

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include "mysql.h"  
  4. int main()  
  5. {  
  6.     MYSQL my_connection;  
  7.     mysql_init(&my_connection);  
  8.       
  9.     if (mysql_real_connect(&my_connection, "localhost""wcdj""123""newdatabase", 0, NULL, 0))  
  10.     {  
  11.         printf("Connection success/n");  
  12.         mysql_close(&my_connection);  
  13.     }  
  14.     else  
  15.     {  
  16.         fprintf(stderr, "Connection failed/n");  
  17.         if (mysql_errno(&my_connection))  
  18.         {  
  19.             fprintf(stderr, "Connection error %d: %s/n", mysql_errno(&my_connection),  
  20.             mysql_error(&my_connection));  
  21.         }  
  22.     }  
  23.     return EXIT_SUCCESS;  
  24. }  


编译程序:
$ gcc -I/usr/include/mysql connect2.c -L/usr/lib/mysql -lmysqlclient -o connet2

假设当前没有创建 newdatabase 这个数据库,运行 connect2 将提示如下错误信息:
测试:
$ ./connect2
Connection failed
Connection error 1049: Unknown database 'newdatabase'
登录mysql
$ mysql -u wcdj --password=123
创建一个新的数据库newdatabase
mysql> CREATE DATABASE newdatabase;
退出wcdj用户
mysql> /q

再此测试 connect2:
Connection success

修改 connect2.c 中的密码 123 为一个错误的密码,再测试会提示如下错误信息:
Connection failed
Connection error 1045: Access denied for user 'wcdj'@'localhost' (usig password: YES)

 

 

参考

Linux 程序设计(第4版)第8章 P.283

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值