执行sql语句后的数据处理api

链接上mysql之后可以使用一些api对数据库进行一些操作

1 int mysql_query(MYSQL * connection, const char * query)

这是执行sql语句的函数,成功的话返回0

1.不返回数据的sql语句

对于update,delete,insert等操作

1 my_ulonglong mysql_affected_rows(MYSQL *connection);

这个函数返回受到影响的行数

2.发现插入的内容

1 select LAST_INSERT_ID();

可以找到最后一次影响的auto_increment的值

3.返回数据的语句
c程序中的数据处理的四个步骤是
    1)执行查询
    2)提取数据
    3)处理数据
    4)必要的清理

这里提取数据的函数是
mysql_use_result    //一次返回一行数据
mysql_store_result    //一次返回所有数据

这里处理数据的函数是
mysql_fetch_row

这里释放查询占用的内存资源的函数是

mysql_free_result>>>void mysql_free_result(MYSQL_RES * result);

***mysql_store_result函数

1 MYSQL_RES * mysql_store_result(MYSQL * connection);//成功返回指向结果集的指针,失败返回NULL
2 my_ulonglong mysql_num_rows(MYSQL_RES * result);//可以得到结果集中的行数
3 MYSQL_ROW mysql_fetch_row(MYSQL_RES * result);//得到结果集中的一行,放到一个行结构中
4 void mysql_data_seek(MYSQL_RES * reslut, my_ulonglong offset);//设置下次mysql_fetch_row的位置
5 //0的时候是下次从第一行开始取行,n-1意味着下次从第n行开始取行结构
6 MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES * result);//返回一个偏移值表示结果集中的当前位置
7 //不能用于mysql_data_seek中,但是可以用到myslq_row_seek中,如下
8 MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES * result, MYSQL_ROW_OFFSET offset);
9 //移动当前的位置到offste,返回的是之前的位置

***mysql_use_result函数

1 MYSQL_RES * mysql_use_result(MYSQL * connection);//一次返回一行数据,所以不能使用mysql_num_rows了

4.处理返回的数据
mysql提供两种类型的数据
    1)从表格中提取的信息,就是列数据
    2)关于数据的数据,也就是元数据(metadata),例如列名和类型

1 unsigned int mysql_field_count(MYSQL * connection);//接受连接对象,返回结果集中的字段(列)数目
2 MYSQL_FIELD * mysql_fetch_field(MYSQL_RES * result);//接受结果集,将元数据和数据提取到一个新的结构中
3 MYSQL_FIELD_OFFST mysql_field_seek(MYSQL_RES * result, MYSQL_FIELD_OFFSET offset);
4 //这个函数会随着mysql_fetch_field调用而自动增加,要是给参数offste传递值0,将跳回第一列

下面是一个综合使用上面的api的例子

  1 #include <stdlib.h>
  2 #include <stdio.h>
  3
  4 #include "mysql.h"
  5
  6 MYSQL my_connection;//定义链接结构
  7 MYSQL_RES *res_ptr;//定义指向结果集的指针
  8 MYSQL_ROW sqlrow;//定义行结构
  9
 10 void display_header();//定义类型打印函数
 11 void display_row();//定义行打印函数
 12
 13
 14 int main(int argc, char *argv[])
 15 {
 16    int res;
 17    int first_row = 1;
 18
 19    mysql_init(&my_connection);//初始化连接
 20    if (mysql_real_connect(&my_connection, "localhost", "root", "", "foo", 0, NULL, 0))
 21    {//建立和数据库的连接
 22       printf("Connection success\n");
 23
 24       res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");
 25     //执行一条查询语句,针对的是当前的连接
 26       if (res)
 27       {
 28          fprintf(stderr, "SELECT error: %s\n", mysql_error(&my_connection));
 29       } else
 30       {//指定sql语句成功的话
 31          res_ptr = mysql_use_result(&my_connection);//一次一行返回到指向结果集结构的指针
 32          if (res_ptr)
 33          {//成功的话
 34             display_header();//进入子函数打印相应的结构信息
 35             while ((sqlrow = mysql_fetch_row(res_ptr))) //获取结果集中一行,放到行结构中
 36             {
 37                if (first_row)
 38                {//恒执行
 39                   display_header();//进入子函数打印相应的结构信息
 40                   first_row = 0;//给整型值赋值为0
 41                }
 42                display_row();//进入子函数打印行信息
 43             }
 44             if (mysql_errno(&my_connection))
 45             {//失败的话,打印失败的信息
 46              fprintf(stderr, "Retrive error: %s\n",mysql_error(&my_connection));
 47             }
 48          }
 49          mysql_free_result(res_ptr);//释放查询占用的内存资源
 50       }
 51       mysql_close(&my_connection);//关闭连接
 52    }
 53    else
 54    {//连接失败处理
 55       fprintf(stderr, "Connection failed\n");
 56       if (mysql_errno(&my_connection)) {
 57         fprintf(stderr, "Connection error %d: %s\n",
 58                                 mysql_errno(&my_connection),
 59                                 mysql_error(&my_connection));
 60         }
 61     }
 62
 63    return EXIT_SUCCESS;
 64 }
 65
 66
 67 void display_header() {
 68    MYSQL_FIELD *field_ptr;
 69
 70    printf("Column details:\n");
 71
 72    while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) //传入指向结果集指针,提取元数据和数据到一个新结构中
 73    {
 74       printf("\t Name: %s\n", field_ptr->name);//打印列名
 75       printf("\t Type: ");//打印类型
 76       if (IS_NUM(field_ptr->type))
 77       {
 78          printf("Numeric field\n");//类型是数值型情况
 79       } else
 80       {//其他情况
 81          switch(field_ptr->type)
 82          {
 83             case FIELD_TYPE_VAR_STRING:
 84                printf("VARCHAR\n");
 85             break;
 86             case FIELD_TYPE_LONG:
 87                printf("LONG\n");
 88             break;
 89             default:
 90               printf("Type is %d, check in mysql_com.h\n", field_ptr->type);
 91          } /* switch */
 92       } /* else */
 93
 94       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 */
 95       if (field_ptr->flags & AUTO_INCREMENT_FLAG)
 96          printf("\t Auto increments\n");
 97       printf("\n");
 98    } /* while */
 99 }
100
101
102 void display_row() {
103    unsigned int field_count;
104
105    field_count = 0;
106    while (field_count < mysql_field_count(&my_connection)) //列数目个打印
107    {
108       if (sqlrow[field_count]) printf("%s ", sqlrow[field_count]);//对行结构打印
109       else printf("NULL");
110       field_count++;
111    }
112    printf("\n");
113 }

执行的结果

 1 [email protected]:~/c_program/544977-blp3e/chapter08$ gcc -I/usr/include/mysql select4.c -L/usr/lib/mysql -lmysqlclient -o select4
 2 [email protected]:~/c_program/544977-blp3e/chapter08$ ./select4
 3 Connection success
 4 Column details:
 5      Name: childno
 6      Type: Numeric field
 7      Max width 11
 8      Auto increments
 9
10      Name: fname
11      Type: VARCHAR
12      Max width 30
13
14      Name: age
15      Type: Numeric field
16      Max width 11
17
18 Column details:
19 1 Jenny 17
20 2 Andrew 13
21 6 Alex 11
22 [email protected]:~/c_program/544977-blp3e/chapter08$ 
时间: 2024-11-03 22:11:38

执行sql语句后的数据处理api的相关文章

关于hibernate执行sql语句后,进程不关闭的问题

写了一个简单的测试程序,就是java查询数据库的,后面发现了数据库查询结束后,进程一直不会结束,在调试的时候,发现生成了一个线程,是这个线程不关闭. /** * */ package com.test.mysql; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hi

PDO中执行SQL语句的三种方法

在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO构造函数连接数据库及DSN详解>中,我们介绍了如何使用构造函数连接数据库和DSN的详解,那么我们这篇文章跟大家介绍在PDO中执行SQL语句的三种方式,下面我们将一一介绍! 第一种方法:exec()方法 exec()方法返回执行SQL 语句后受影响的行数,其语法格式如下: 1 int PDO::exec(

ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法

ORA-01843: 无效的月份失败的 sql 为:XXXXXXXXXXXXXXXX 执行sql语句更改为美国语言后仍然失败, ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 结果是注册表的问题,优化后多余的语言被清理掉了,所以,要修复注册表 将下面的文件复制保存为注册表文件.reg双击导入注册表. windows server 2005 系统时区文件 Time Zones.reg的文件内容,适用于windows server 2008 r2 我是

DB操作-用批处理执行Sql语句

用批处理在命令行状态下调用查询分析器来执行这个sql文件里的语句.下面就是sqlserver帮助里对于查询分析器(isqlw)命令行参数的解释:isqlw 实用工具(SQL 查询分析器)使您得以输入 Transact-SQL 语句.系统存储过程和脚本文件.通过设置快捷方式或创建批处理文件,可以启动预配置的 SQL 查询分析器. 1.语法 isqlw     [-?] |      [          [-S server_name[instance_name]]          [-d da

EF中执行sql语句

EF原理 EF 会自动把 Where().OrderBy().Select()等这些编译成"表达式树(Expression Tree)",然后会把表达式树翻译成 SQL 语句去执行.(编译原理,AST)因此不是"把数据都取到内存中,然后使用集合的方法进行数据过滤",因此性能不会低.但是如果这个操作不能被翻译成 SQL 语句,则或者报错,或者被放到内存中操作,性能就会非常低 跟踪EF的查询Sql语句: DbContext 有一个 Database 属性,其中的 Log

linux程序设计——执行SQL语句(第八章)

8.3    使用C语言访问MySQL数据 8.3.3 执行SQL语句 执行SQL语句的主要API函数被恰当的命名为: int mysql_query(MYSQL *connection, const char *query); 这个例程接受连接结构指针和文本字符串形式的有效SQL语句,如果成功,它返回0. 1.不返回数据的SQL语句 为简单起见,先看一些不返回任何数据的SQL语句:UPDATE,DELETE和INSERT. 下面的函数用于检查受查询影响的行数: my_ulonglong mys

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

[文章摘要] 在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句. 本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词] SQL语句  C语言  程序  流程  开发 一.为什么要在C语言程序中执行SQL语句? 在C语言程序中执行SQL语句的原因有以下几个: (1) 程序需要获取数据库中某数据表的字段值,并对这些字

.net core下直接执行SQL语句并生成DataTable

.net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList().而不允许返回DataSet.DataTable等弱类型.可能由于这个原因没有实现在.net core中DataTable,然而DataTable还是可能会用到的.我们这里就有一个数据仓库的需求,允许用户自行编写类似SQL语句,然后执行,以表格展示.因为语句是千变万化的,因此我也

JDBC系列:(2)使用Statement执行sql语句

执行sql语句的接口 接口 作用 Statement接口 用于执行静态的sql语句 PreparedStatement接口 用于执行预编译sql语句 CallableStatement接口 用于执行存储过程的sql语句(call xxx) 1.执行DDL语句 package com.rk.db.b_statement; import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException;