利用C API连接数据库
一、基本步骤:
- 1.定义mysql结构体变量
- 2.mysql_init()初始化链接
- 3.mysql_real_connect()连接数据库
- 4.mysql_query()执行查询语句
- 5.mysql_store_result()检索完整的结果集
- 6.mysql_num_rows(),mysql_num_fields()获取数据库表的行与列
- 7.循环每一行,利用mysql_fetch_row()获取每一行的内容
- 8.循环每一列,逐次输出数据表的内容
9.可在第5部操作后判断是否为SELECT操作,若不是再进行处理
二、涉及函数简介:
1. mysql_init():
初始化mysql结构体
2. 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 int client_flag):
(1). 第一个参数应该是一个现存MYSQL结构的地址。在调用mysql_real_connect()之前,你必须调用mysql_init()初始化MYSQL结构。
(2). host值可以是一个主机名或一个IP地址。如果host是NULL或字符串”localhost”,假定是到本地主机的一个连接。如果OS支持套接字(Unix)或命名管道(Win32),使用他们而不是TCP/IP与服务器连接。
(3). user参数包含用户的MySQL登录ID。如果user是NULL,假定是当前用户。在Unix下,它是当前登录名。在Windows ODBC下,必须明确地指定当前用户名字。
(4). passwd参数为user包含口令。如果passwd是NULL,只有在user表中对于有一个空白口令字段的用户的条目将被检查一个匹配。
(5). db是数据库名。如果db不是NULL,连接将缺省数据库设置为这个值。
(6). 如果port不是0,值对于TCP/IP连接将用作端口号。注意host参数决定连接的类型。
(7). 如果unix_socket不是NULL,字符串指定套接字或应该被使用的命名管道。注意host参数决定连接的类型。
(8). client_flag值通常是0
3. mysql_query(query,connection):
(1). 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
(2). 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。
(3). 返回值:mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。
对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。
4. mysql_store_result(MYSQL *mysql):
检索完整的结果集至客户端。
5. mysql_num_fields(data)
mysql_num_fields() 函数返回结果集中字段的数
(1). data:必需。规定规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。
6. mysql_num_rows(data)
mysql_num_rows() 函数返回结果集中行的数目
(1). data:必需。结果集。该结果集从 mysql_query() 的调用中得到。
7. mysql_fetch_row(data)
mysql_fetch_row() 函数从结果集中取得一行作为数字数组
(1). data:必需。要使用的数据指针。该数据指针是从 mysql_query() 返回的结果。
(2). 返回值:返回根据所取得的行生成的数组,如果没有更多行则返回 false。
8. mysql_field_count(MYSQL *mysql)
返回作用在连接上的最近查询的列数。该函数的正常使用是在mysql_store_result()返回NULL(因而没有结果集指针)时。在这种情况下,可调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果。
9. mysql_affected_rows(link_identifier)
mysql_affected_rows() 函数返回前一次 MySQL 操作所影响的记录行数。
(1). link_identifier:必需。MySQL 的连接标识符。如果没有指定,默认使用最后被 mysql_connect() 打开的连接。如果没有找到该连接,函数会尝试调用 mysql_connect() 建立连接并使用它。如果发生意外,没有找到连接或无法建立连接,系统发出 E_WARNING 级别的警告信息。
(2). 返回值:执行成功,则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 -1。
如果最近一次操作是没有任何条件(WHERE)的 DELETE 查询,在表中所有的记录都会被删除,但本函数返回值在 4.1.2 版之前都为 0。
当使用 UPDATE 查询,MySQL 不会将原值与新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数,只有真正被修改的记录数才会被返回。
REPLACE 语句首先删除具有相同主键的记录,然后插入一个新记录。该函数返回的是被删除的记录数加上被插入的记录数。
三、涉及结构体简介
1. MYSQL
这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL 函数。
2. MYSQL_RES
这个结构代表返回行的一个查询的(SELECT , SHOW , DESCRIBE ,EXPLAIN )的结果。从查询返回的信息在本章下文称为结果集合 。
3. MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row() 获得。
4. MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field() 对每一列获得MYSQL_FIELD 结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW 结构中。
四、代码
#include<mysql/mysql.h>
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i,j;
MYSQL mysql,*sock; //对一个数据库连接的句柄
mysql_init(&mysql); //初始化MYSQL
/*连接数据库,mysql_real_connect返回一个句柄指针*/
if(!(sock = mysql_real_connect(&mysql,"localhost","root","lmd009713","test",0,NULL,0)))
{
printf("Cannot connect to database:%s\n",mysql_error(sock));
return 0;
}
char string[200]="SELECT *FROM test1";
/*查询指定的,以NULL终结的字符串,若成功返回0*/
if(mysql_query(sock,string))
{
printf("Query Failed:%s\n",mysql_error(sock));
return 0;
}
MYSQL_RES *result; //返回行的查询结果,返回的数据称为数据集
unsigned uline=0,ufield=0; //行数,字段数
MYSQL_ROW row; //行数据的类型
unsigned long *lengths;
if(!(result = mysql_store_result(sock)))
{
printf("Failed to store result:%s\n",mysql_error(sock));
return 0;
}
uline=(unsigned)mysql_num_rows(result); //获得行数
ufield=(unsigned)mysql_num_fields(result); //获得字段数
/*返回作为一个MYSQL_FIELD结构的一个结果集合的一个列的定义*/
if(result)
{
for(i=0;i<uline;i++)
{
row=mysql_fetch_row(result);
for(j=0;j<ufield;j++)
{
cout<<row[j]<<" ";
}
cout<<endl;
}
}
else{
if(mysql_field_count(sock)==0)
{
int str = mysql_affected_rows(sock);
}
else
{
cout<<"WRONG"<<endl;
return 0;
}
}
}
附:编译程序的时候在命令后面添加 mysql_config --cflags --libs