设为首页 收藏本站
查看: 522|回复: 0

[经验分享] mysql api---从一个小例子开始mysql编程入门(2)

[复制链接]

尚未签到

发表于 2018-10-2 10:38:56 | 显示全部楼层 |阅读模式
  接着说mysql api
  数据类型
  MYSQL
  该结构代表1个数据库连接的句柄。几乎所有的MYSQL函数均使用它。
  MYSQL_RES
  该结构代表返回行的查询结果
  MYSQL_ROW
  这是1行数据的”类型安全”表示。
  MYSQL_FIELD
  该结构包含关于字段的信息,如字段名、类型和大小等
  MYSQL_FIELD_OFFSET
  这时MYSQL字段列表偏移量的”类型安全”表示
  my_ulonglong
  用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型
  编程步骤
  1  通过调用mysql_library_init(),初始化MYSQL库(此步骤一般不用)
  2  通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器
  3  发出SQL语句并处理其结果mysql_query()
  注意: (1) 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。即查询需用到上面的函数处理
  (2)释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
  4  通过调用mysql_close(),关闭与MYSQL服务器的连接
  5  通过调用mysql_library_end(),结束MYSQL库的使用(如果第一步省略,这一步可以省略)
  数据库连接
  初始化一个连接句柄结构
  #include
  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);//此函数前面已经说过,这儿就不在细说
  连接参数
  int mysql_options(MYSQL mysql, enum mysql_option option, const char *arg)
  可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
  应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
  选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
  可能的选项值:
  MYSQL_READ_DEFAULT_GROUP         char *
  从my.cnf或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名组读取选项。
  //此函数可以在用到时再去查手册
  错误处理
  unsigned int mysql_errno(MYSQL connection);
  对于由mysql指定的连接,该函数返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。”0”返回值表示未出现错误
  char mysql_error(MYSQL *connection)
  如果想获得错误的文本信息,可以调用该函数
  执行SQL语句
  int mysql_query(MYSQL mysql,const char query)
  功能描述:
  执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句
  mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
  如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查
  对于操纵语句
  My_ulonglong mysql_affected_rows(MYSQL *mysql)
  返回上次操纵语句所涉及到记录的行数
  对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,该函数的工作方式与mysql_num_rows()类似
  对于查询语言
  MYSQL_RES mysql_store_result(MYSQL mysql)
  功能说明:
  对于成功检索了数据的每个查询,必须调用mysql_store_result()或mysql_use_result()
  该函数将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中
  可以通过mysql_num_rows来找出结果集中的行数
  处理结果集
  MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
  功能描述
  检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
  行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
  可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
  返回值
  下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL
  每次接收一行数据
  MYSQL_RES mysql_use_result(MYSQL mysql)
  功能说明:
  不像mysql_store_result()那样把结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。
  mysql_store_result()相比,速度更快而且使用的内存更少
  说明一下:mysql_store_result与mysql_use_result区别
  mysql_store_result 会把数据库的数据缓存到本地,下次通过mysql_fetch_row从本地缓存中去读数据,而mysql_use_result只是建立了一个到数据库的链接,并没有缓存数据库数据,通过调用mysql_fetch_row每次都是从数据库去读数据
  对于少量数据当然mysql_store_result效率更高,大量数据对的话最好用mysql_use_resut效率更高
  

    看了这么久的api 怎么用呢?  请看下面的代码
  

  #include
  #include
  #include
  #include
  ////unsigned int mysql_errno(MYSQL *mysql)
  int main()
  {
  

int     ret = 0;  

  
MYSQL   mysql;
  
MYSQL   *connect = NULL;
  
connect = mysql_init(&mysql) ;
  
if (connect == NULL)
  
{
  ret =  mysql_errno(&mysql) ;
  printf("func mysql_init() err \n");
  return ret;
  
}
  
printf("func mysql_init() ok \n");
  
connect = mysql_real_connect(connect, "localhost", "root", "mysql", "pos", 0, NULL, 0);
  
if (connect == NULL)
  
{
  ret =  mysql_errno(&mysql) ;
  printf("func mysql_init() err \n");
  return ret;
  
}
  
printf("func mysql_real_connect() ok \n");
  

  
//查询
  
const char *query = "select *from product";
  
ret = mysql_query(&mysql, query);
  
if (ret != 0)
  
{
  ret =  mysql_errno(&mysql) ;
  printf("func mysql_query() err \n");
  return ret;
  
}
  

  
//typedef char ** MYSQL_ROW;               /* return data as array of strings */
  
//typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
  

  
//获取结果集合
  
//结果集合中 可以含有10行数据
  
MYSQL_RES *result = mysql_store_result(&mysql);
  

  
MYSQL_ROW row = NULL;
  
while (row = mysql_fetch_row(result) )
  
{
  //  如何 获取 selct查询 有多少列?
  // 获取表头的函数? ...
  printf("%s, %s, %s, %s, %s, %s, %s, %s \n", row[0], row[1],row[2],row[3],row[4],row[5],row[6],row[7]);
  
}
  

  
mysql_free_result(result);
  
mysql_close(&mysql);
  
printf("hello...\n");
  
return ret;
  

  }
  看到这儿是否对MYSQL_ROW很晕呢?下面说一下他的原型,你就知道了
  请看下面的模型
  //二级指针 三种内存模型
  //二级指针 从分配内存的 角度 输入和输出...
  //typedef char * MYSQL_ROW;               / return data as array of strings */
  可以看到MYSQL_ROW 是一个二级指针
  大概的原型如下
  /*
  char * mysql_fetch_row(MYSQL_RES res)
  {
  int i = 0;
  char p = (char ) malloc(sizeof(char )   7);//分配空间,假设有7列
  for (i=0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607457-1-1.html 上篇帖子: 安装unixODBC安装连接mysql-linux运维空间 下篇帖子: Zabbix部署及邮件报警(zabbix、mysql-master、mysql-slave、LAP)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表