用C语言连接MysqL数据库包含两个步骤:

1 初始化一个连接句柄结构

2 实际进行连接


使用MysqL_init来初始化连接句柄

#include <MysqL.h>

MysqL * MysqL_init(MysqL *);

通常你传递NULL给这个例程,它会返回一个指向新分配的连接句柄结构的指针。如果你传递一个已有的结构,它将被重新初始化。这个例程在出错时返回NULL。

什么是句柄?

在程序设计中,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

分配和初始化了一个结构,仍需要使用MysqL_real_connect来向一个连接提供参数:

MysqL * MysqL_real_connect(MysqL *connection,

const char * server_host,microsoft yahei">const char * sql_user_name,microsoft yahei">const char * sql_password,microsoft yahei">const char * db_name,microsoft yahei">unsigned int port_number,microsoft yahei">const char * unix_socket_name,microsoft yahei">unsigned int flags,);

connection:指向已经被MysqL_init初始化过的结构

server_host:可以是主机名,也可以是ip地址。如果只是连接到本地机器,你可以通过指定localhost来优化连接类型。

sql_user_name:数据库登录名

sql_password:数据库密码

db_name:数据库名

port_number:端口号(没改变MysqL默认设置,使用0表示默认值)

unix_socket_name:为NULL表示默认值

flags:用来对一些定义的位模式进行OR操作,使得改变使用协议的某些特性。

void MysqL_close(MysqL *connection);

关闭连接。如果连接是由MysqL_init建立的,MysqL结构会被释放。指针将会失效并无法再次使用。保留一个不需要的连接是对资源的浪费,但是重新打开连接也会带来额外的开销,所以必须自己权衡何时使用这些选项。


MysqL_options(仅能在MysqL_init和MysqL_real_connect之间调用)

int MysqL_options(MysqL *connection,enum option_to_set,const char *argument);

因为MysqL_options一次只能设置一个选项,所以每设置一个选项就得调用它一次。你可以多次调用,只要它出现在MysqL_init和MysqL_real_connect之间即可。

列出3个最常用的选项,如下:

enum选项 实际参数类型 说明
MysqL_OPT_CONNECT_TIMEOUT const unsigned int * 连接超时之前的等待秒数
MysqL_OPT_COMPRESS 使用NULL 网络连接中使用压缩机制
MysqL_INIT_COMMAND const char * 每次连接建立后发送的命令

一次成功的调用返回0。

以用户名root和密码yao来连接本机服务器上名为test的数据库

connect.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdlib.h>
#include <stdio.h>
#include "MysqL.h"
int main( argc, char **argv)
{
MysqL * conn_ptr;
conn_ptr = MysqL_init(NULL);
if (!conn_ptr)
{
perror ( "MysqL_init Failed\n" );
exit (1);
}
conn_ptr = MysqL_real_connect(conn_ptr, "localhost" ,monospace!important; font-size:1em!important; min-height:auto!important; color:blue!important; background:none!important">"root" "yao" "test" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,NULL);
(conn_ptr)
{
printf "connection success\n" );
}
else
{
"connection Failed\n" );
}
MysqL_close(conn_ptr);
return 0;
}

编译这个程序,需要同时添加include路径和库文件路径,以及指定链接的库模块MysqLclient。

gcc -I/usr/include/MysqL connect.c -L/usr/lib/MysqL -lMysqLclient -o connect

可能的错误:

Centos 6.4 64位系统下使用C语言访问MysqL 找不到MysqLclient


解决:

-L/usr/lib/MysqL改为-L/usr/lib64/MysqL


错误处理

MysqL使用一系列由连接句柄结构报告的返回码。

unsigned int MysqL_errno(MysqL * connection);

char * MysqL_error(MysqL * connection);

通过调用MysqL_errno并传递连接结构来获得错误码,通常都是非0值。如果未设定错误码,它将返回0。因为每次调用库都会更新错误码,所以你只能得到最后一个执行命令的错误码。上面两个错误检查函数是例外,它们不会导致错误码的更新。

MysqL_errno的返回值实际上就是错误码,它们在头文件errmsg.h或MysqLd_error.h中定义。这两个文件都可以在MysqL的include目录中找到。前者报告客户端错误,后者关注服务端错误。

如果喜欢文本信息错误,调用MysqL_error,提供了有意义的文本信息,这些信息被写入一些内部静态内存空间中。

使用非动态分配的连接结构

22
MysqL MysqL_conn;
MysqL_init(&MysqL_conn);
(MysqL_real_connect(&MysqL_conn,monospace!important; font-size:1em!important; min-height:auto!important; color:blue!important; background:none!important">"dfdsfjfd" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,NULL))
{
);
MysqL_close(&MysqL_conn);
}
else
{
);
(MysqL_errno(&MysqL_conn))
{
fprintf (stderr,monospace!important; font-size:1em!important; min-height:auto!important; color:blue!important; background:none!important">"connection error %d:%s\n" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,MysqL_errno(&MysqL_conn),MysqL_error(&MysqL_conn));
}
}
0;
注:这里我使用动态分配的连接结构,错误信息不产生。

执行sql语句

执行sql语句的函数为

int MysqL_query(MysqL *connection,const char *query);

这个函数接受连接结构指针和文本字符串形式的有效sql语句(没有结束的分号)。如果成功,返回0.对于包含二进制数据的查询,可以使用第二个函数MysqL_real_query。

1 不返回数据的sql语句

不返回任何数据的sql语句:update delete insert

这里介绍另一个重要函数,用于检查首查询影响的行数

my_ulonglong MysqL_affected_rows(MysqL *connection);

这个函数的返回值类型很不常见,它使用无符号类型。当你使用printf时,推荐使用%lu格式将其转换为无符号长整数。这个函数返回受之前执行的update、insert或delete查询影响的行数。如果你使用过其他sql数据库,MysqL返回的是被一个更新操作修改的行数,但许多其他数据库将仅仅因为记录匹配where子句就把它视为已经更新过。

插入一条数据

27
28
29
30
31
32
33
34
res;
MysqL_init(&MysqL_conn);
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,NULL))
res = MysqL_query(&MysqL_conn,monospace!important; font-size:1em!important; min-height:auto!important; color:blue!important; background:none!important">"insert into child(childid,age,name) values (1,12,'bing')" );
(!res)
{
"inserted %lu rows\n" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,(unsigned long )MysqL_affected_rows(&MysqL_conn));
}
"insert error %d:%s" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,MysqL_error(&MysqL_conn));
MysqL_close(&MysqL_conn);
}
else
{
);
(MysqL_errno(&MysqL_conn))
{
"Connection error %d:%s\n" ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,MysqL_error(&MysqL_conn));
}
}
0;

今天先到这,下次继续补充。。。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Centos下搭建性能监控Spotlight
Centos下搭建性能监控Spotlight
CentOS 6.3下Strongswan搭建IPSec VPN
CentOS 6.3下Strongswan搭建IPSec VPN
在CentOS6.5上安装Skype与QQ
在CentOS6.5上安装Skype与QQ
CentOS 6.3下配置multipah
CentOS 6.3下配置multipah
CentOS安装、配置APR和tomcat-native
CentOS安装、配置APR和tomcat-native
centos6.5下postgres-XC集群安装与配置
centos6.5下postgres-XC集群安装与配置
CentOS6.6中安装VNC server
CentOS6.6中安装VNC server
CentOS下更新Python最新版本
CentOS下更新Python最新版本
  • • Centos下搭建性能监控Spotlight
  • • CentOS 6.3下Strongswan搭建IPSec VPN
  • • 在CentOS6.5上安装Skype与QQ
  • • 阿里云基于centos6.5主机VPN配置
  • • CentOS 6.3下配置multipah
  • • CentOS安装、配置APR和tomcat-native
  • • centos6.5下postgres-XC集群安装与配置
  • • CentOS 6使用openssl搭建根CA
  • • CentOS6.6中安装VNC server
  • • CentOS下更新Python最新版本
  • • Centos下搭建性能监控Spotlight
  • • CentOS 6.3下Strongswan搭建IPSec VPN
  • • 在CentOS6.5上安装Skype与QQ
  • • 阿里云基于centos6.5主机VPN配置
  • • CentOS 6.3下配置multipah
  • • CentOS安装、配置APR和tomcat-native
  • • centos6.5下postgres-XC集群安装与配置
  • • CentOS 6使用openssl搭建根CA
  • • CentOS6.6中安装VNC server
  • • CentOS下更新Python最新版本
pythonJavaScriptjavaHTMLPHPreactjsC#AndroidCSSNode.jssqlrpython-3.xMysqLjQueryc++pandasFlutterangularIOSdjangolinuxswifttypescript路由器JSON路由器设置无线路由器h3c华三华三路由器设华三路由器电脑软件教程arraysdocker软件图文教程Cvue.jslaravelspring-boot

CentOS 6.4系统下使用C语言访问Mysql的更多相关文章

  1. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  2. 开始使用 swift 的 c语言 库

    为了手头上的一个项目,我需要使用CommonCrypto库中的HMAC函数.虽然苹果在swift中已经提供了许多系统库,但是CommonCrypto不在其中.庆幸的是,要使用这个库并不怎么费事,只需要做一点额外的工作.开始访问库在使用库之前,我们需要通知Swift编译器.要完成这个过程,我们有两种方式.它们都能在示例工程中正常运行,但是你应该根据你代码的用途来选择具体的方式.好消息是,你随便使用那

  3. Swift教程10-运算符与C语言的不同

    =,==这些运算符和其他语言的类似,是比较前后两个值是否相等,或者大小关系比较字符串内容是否相等,使用==即可但是Swift新增了===恒等于,是针对于引用类型,如两个对象之间是否是同一个对象与之对应的是!运算符示例Swift新增的??

  4. Swift 体会

    前言Swift体会我不算是一个果粉,但是我很喜欢苹果的产品,甚至可以说是狂热。运行速度从苹果官方所给出的数据来看,Objective-C比Python快2.8倍,而Swift比Python快3.9倍,可见苹果在Swift上下了大量的功夫进行优化。开发环境Swift语言的开发环境是苹果公司提供的集成开发环境Xcode,可以用来开发iOS应用、iOS游戏、OSX窗体程序、OSX游戏、OSX命令行程序,读者可以直接从AppStore中搜索并下载。由于Swift是苹果的产品,所以目前只支持苹果的系统。

  5. [翻译]Swift编程语言——关于Swift

    Swift是一门用于iOS和OSX应用开发的新的编程语言,它以C和Objective-C语言为基础,但没有C语言的兼容性约束。Swift的酝酿花费了数年。Apple为了Swift改进了已有的编译器、调试器和框架的底层。对于Objective-C语言的开发者,Swift是那样的似曾相识。在这个基础之上,Swift引入了许多新的特性并且支持面向对象编程。Swift将现代编程语言的精华和苹果工程文化中的智慧结合在一起。所有这些使得Swift对于开发者和Apple都是一笔对未来可靠的投资。

  6. swift笔记-赋值运算符

    复杂些的运算例如逻辑与运算符&&,或让i值加1的便捷自增运算符++i等。Swift支持大部分标准C语言的运算符,且改进许多特性来减少常规编码错误。当然允许你使用Swift的溢出运算符来实现溢出。本章节只描述了Swift中的基本运算符,高级运算符包含了高级运算符,及如何自定义运算符,及如何进行自定义类型的运算符重载。三元运算符操作三个操作对象,和C语言一样,Swift只有一个三元运算符,就是三目运算符(a?

  7. runTime(二)

    我们前面已经讲过一篇runtime原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!首先,第一个问题,1》runtime实现的机制是什么,怎么用,一般用于干嘛?在我们平时编写的OC代码中,程序运行过程时,其实最终都是转成了runtime的C语言代码,runtime算是OC的幕后工作者比如说,下面一个创建对象的方法中,举例:OC:第二个问题runtime用来干什么呢??..这是我们学习runtime必须知道的函数!

  8. Swift:基本概述

    在介绍Swift之前,先说一段小插曲。Swift中文被翻译为“雨燕”。swift语言是苹果2014年6月3日正式推出一门新的的语言。),大家也许会困惑了,我不是在介绍Swift的使用吗?更容易让很多初学者愿意往Swift方面发展。并且它尽可能的保持方法名类名与objective-c中的一致,这也使得一些长期从事objective-c开发的程序员,很方便的转向Swift的开发。

  9. Swift学习笔记九——整型Int在Swift中表示的最大值最小值问题

    我们在学习C语言的时候,总是会去记忆一些数值,如int能表示的最大值最小值,long型能表示的最大值最小值。来到Swift中就比较简单了,直接用代码就可以看到类型所能表示的最值。。如图所示,Int8表示占一个字节,Int16表示占两个字节,以此类推。妈妈再也不用担心我记忆这些麻烦的数据了。

  10. Swift学习笔记十——Swift对数据溢出的智能检查

    我们之前说过很多次,Swift是一门类型安全的语言,能把很多运行时或者编译时遇到的问题在写代码过程中就暴露出来,使程序员少犯错误。Swift对于溢出的检查也是非常智能的,不像C语言一样,溢出了都不知道,运行中出现各种意想不到的“惊喜”。。在示例代码中,Int.max已经是当前所能表示的最大值,如果再执行加法操作,就会报错“Arithmeticoperation'.........+1'resultsintanoverflow”错误,明确告诉你已经溢出了。Int.min-1操作也是类似。所以我们再次体会到了

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部