沉沙
2018-05-17
来源 :
阅读 1131
评论 0
摘要:本篇MySQL数据库教程讲解了如何使用C语言操作MySQL的操作步骤,希望阅读本文以后对大家学习MySQL数据库有所帮助。
连接
C语言连接MySQL包含两步:
· 初始化一个连接句柄
· 实际进行连接
MYSQL *mysql_init(MYSQL *); //参数含义可查 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);
Ex:
MYSQL *conn_ptr;
conn_ptr = mysql_init(NULL);if(!conn_ptr)
{
...//mysql_init failed
}
conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret", "foo", 0, NULL, 0);if(conn_ptr)
{
...//connection success
}else
{
...//connection failed
}错误处理
char *mysql_error(MYSQL *connection); unsigned int mysql_errno(MYSQL *connection);
Ex:
MYSQL *conn_ptr;
conn_ptr = mysql_init(NULL);if(!conn_ptr)
{
...//mysql_init failed
}
conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret", "foo", 0, NULL, 0);if(conn_ptr)
{
...//connection success
}else
{
if(mysql_errno(conn_ptr))
{
fprintf(stderr, "Connection error %d: %s\n",mysql_errno(conn_ptr), mysql_error(conn_ptr));
}
}执行SQL语句
执行sql语句的主要API函数为:
//传入连接名和sql语句,成功返回0int mysql_query(MYSQL *connection, const char *query)
对sql语句的执行结果有两种情况:
· 不返回数据(UPDATE,DELETE,INSERT)
· 返回数据(SELECT)
不返回数据
这种情况较为简单,基本是只看成功与不成功
Ex:
MYSQL *conn_ptr;
...//初始化,连接数据库(省略)
res = mysql_query(conn_ptr, "INSERT INTO ... VALUES(...)");if(!res)
{
...//success
}else
{
...//error
}返回数据的语句
一般需要四个步骤:
· 执行查询(mysql_query)
· 提取数据(mysql_use_result;mysql_store_result)
· 处理数据(mysql_fetch_row)
· 必要的清理工作(mysql_free_result)
执行查询
//传入连接名和sql语句,成功返回0int mysql_query(MYSQL *connection, const char *query)
提取数据
有两种提取数据函数:
· mysql_store_result(一次返回所有结果)
· mysql_use_result(一次返回一行数据)
在贴代码之前,还需要知道一个函数:mysql_fetch_row
//从mysql_store_result的结果中提取一行MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
Ex:(mysql_store_result)
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
...//初始化,连接数据库(省略)
res = mysql_query(conn_ptr, "SELECT ... FROM...");if(res)
{
...//error
}else
{
res_ptr = mysql_store_result(conn_ptr);
if(res_ptr)
{
while((sqlrow = mysql_fetch_row(res_ptr)))
{
...
}
}
mysql_free_result(res_ptr);
}
mysql_close(conn_ptr);处理数据
MySQL返回两种类型的数据:
· 从表中提取的信息,即列数据
· 数据的数据,即元数据,例如列名和类型等
mysql_field_count函数提供了一些关于查询结果的基本信息
Ex:
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow; unsigned int field_count=0;
//初始化、连接、得到结果集(省略)
while((sqlrow = mysql_fetch_row(res_ptr)))
{
while(field_count < mysql_field_count(conn_ptr))
{
printf("%s ", sqlrow[field_count]);
field_count++;
}
}清理
· 关闭连接(mysql_close)
· 清内存(mysql_free_result)
API:
void mysql_close(MYSQL *connection);void mysql_free_result(MYSQL_RES *result);
例程
贴一个完整的代码:
#include <stdlib.h>#include <stdio.h>
#include "mysql.h"
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
void display_header();void display_row();
int main(int argc, char *argv[]) {
int res;
int first_row = 1; /* Used to ensure we display the row header exactly once when data is successfully retrieved */
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost", "rick",
"secret", "foo", 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) {
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_ptr;
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");
break;
case FIELD_TYPE_LONG:
printf("LONG\n");
break;
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); /* Note on versions of MySQL before 4.0 the format should be %d, rather than %ld */
if (field_ptr->flags & AUTO_INCREMENT_FLAG)
printf("\t Auto increments\n");
printf("\n");
} /* while */
}
void display_row() {
unsigned int field_count;
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");
}本文由职坐标整理并发布,了解更多内容,请关注职坐标数据库MySQL频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号