永利集团登录网址Linux下C语言连接MySQL

一. 张冠李戴一——使用未起初化的连接管理程序指

八.三.一 连接例程

用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,
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);
指针connection必须指向已经被mysql_init伊始化过的组织。别的参数的意义非常清楚,server_host既可以是主机名,也得以是IP地址。要是只是连接到地面机械,能够经过点名localhost来优化连接类型。
sql_user_name和sql_password的意思和它们的字面意思一样。借使登入名字为NULL,则假设登6名称叫近些日子linux用户的报到ID。若是密码是NULL,则不得不访问服务器上无需密码就可访问的多少。密码会在通过传输前开始展览加密。
port_number和unix_socket_name应该分别为0和NULL,除非更改了MYSQL安装的暗中同意设置。
flag参数用来对部分定义的位方式开始展览O大切诺基操作,使得改换使用协议的少数特征。
假使不可能连接,它将回到NULL。mysql_error函数能够提供有赞助的新闻。
选拔完连接之后,平日在先后退出时,要像下边那样调用函数mysql_close
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三次只可以设置3个精选,所以每安装三个选拔就要调用它二次。上边列出了二个最常用的选项:
enum选项 实际参数类型 表达
MySQL_OPT_CONNECT_TIMEOUT const unsigned int *
连接超时事先的等候秒数
MySQL_OPT_COMPRESS None,使用NULL 网络连接中选择压压编写制定
MySQL_INIT_COMMAND const char * 每一趟一而再创建后发送的通令
就算要安装连接超时时间为七秒,使用的代码片段如下所示:
unsigned int timeout = 7;
connection = mysql_init(NULL);
ret = mysql_options(connection, MYSQL_OPT_CONNECT_TIMEOUT, (const
char *)&timeout);
if (ret){
}
connection = mysql_real_connect(connection…)
接下去使用3个归纳的程序测试一下。
第2进入rick用户,创造1个数据库foo;
mysql -u rick -p
CREATE DATABASE foo;
若果直白在mysql命令行中输入过多创立表和拉长数据的指令,那比较轻易失误,而且只要重复输入这么些命令的话,也很不快捷。因而,创制三个富含所急需命令的公文。
以此文件名字为create_children.sql;
\. /相对路线/create_children.sql 来实践这么些文件
一定要动用create_children.sql的相对路线
.
当今有1个用户,1个数据库和1个保存了某个数额的表,接下去看一下一旦经过代码来拜会那个数据。
编写程序connect一.c,它以用户名rick和密码secret来连接本机服务器上名称叫foo的数据库。假如出现mysql.h找不到的情景,参见linux找不到mysql.h.
编写翻译那些顺序需求相同的时候增添include路线和库文件路线,以及钦赐链接的库模块mysqlclient.
$ gcc connect1.c -o connect1.exe -I/usr/include/mysql -L/usr/lib/mysql
-lmysqlclient
-I/usr/include/mysql是mysql.h的头文件路线
-L/usr/lib/mysql是库文件路线

解决linux上MySQL编程(6):C语言编写MySQL程序(结)

在实际上利用中,大家不大概在指令行登入进数据库举行多少的查询、插入等操作,用户一般是选拔四个分界面能够的应用程序软件来对数码进行田间管理。为了有利于应用程序的支出,MySQL提供了多样编制程序语言(C、perl、php等)的编制程序接口,供开拓者使用。
对于C语言来讲,MySQL提供了C语言客户机库,它同意从此外C程序的内部访问MySQL数据库,客户机完结API,API定义了客户机怎样营造和推行与服务器的通信。使用C语言开垦MySQL项目全体更加好的安全性和属性,C语言API是与MySQL一齐提供的,包蕴在mysqlclient库文件中,用于连接和推行数据库查询。
首先看一下MySQL为C语言操作定义的数据类型。 一.
MYSQL,MYSQL结构意味着2个数据库连接句柄,包涵关于服务器的再三再四意况的音信,大概全数函数都是用到它。其定
义如下:

typedef struct st_mysql
{
  NET           net;                    /* Communication parameters */
  unsigned char *connector_fd;          /* ConnectorFd for SSL */
  char          *host,*user,*passwd,*unix_socket,*server_version,*host_info;
  char          *info, *db;
  struct charset_info_st *charset;
  MYSQL_FIELD   *fields;
  MEM_ROOT      field_alloc;
  my_ulonglong affected_rows;
  my_ulonglong insert_id;               /* id if insert on table with NEXTNR */
  my_ulonglong extra_info;              /* Not used */
  unsigned long thread_id;              /* Id for connection in server */
  unsigned long packet_length;
  unsigned int  port;
  unsigned long client_flag,server_capabilities;
  unsigned int  protocol_version;
  unsigned int  field_count;
  unsigned int  server_status;
  unsigned int  server_language;
  unsigned int  warning_count;
  struct st_mysql_options options;
  enum mysql_status status;
  my_bool       free_me;                /* If free in mysql_close */
  my_bool       reconnect;              /* set to 1 if automatic reconnect */

  /* session-wide random string */
  char          scramble[SCRAMBLE_LENGTH+1];

 /*
   Set if this is the original connection, not a master or a slave we have
   added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
 */
  my_bool rpl_pivot;
  /*
    Pointers to the master, and the next slave connections, points to
    itself if lone connection.
  */
  struct st_mysql* master, *next_slave;

  struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
 /* needed for send/read/store/use result to work correctly with replication */
  struct st_mysql* last_used_con;

  LIST  *stmts;                     /* list of all statements */
  const struct st_mysql_methods *methods;
  void *thd;
  /*
    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag
    from mysql_stmt_close if close had to cancel result set of this object.
  */
  my_bool *unbuffered_fetch_owner;
  /* needed for embedded server - no net buffer to store the 'info' */
  char *info_buffer;
  void *extension;
} MYSQL;
  1. MYSQL_RES
    MYSQL_RES结构意味注重临行的询问结果(SELECT、SHOW、DESC奥德赛IBE等),从数据库读取数据,最终正是从MYSQL_RES中读取数据。
    MYSQL_RES定义如下:

    typedef struct st_mysql_res {
    my_ulonglong row_count;
    MYSQL_FIELD fields;
    MYSQL_DATA
    data;
    MYSQL_ROWS data_cursor;
    unsigned long
    lengths; / column lengths of current row /
    MYSQL handle; / for unbuffered reads /
    const struct st_mysql_methods
    methods;
    MYSQL_ROW row; / If unbuffered read /
    MYSQL_ROW current_row; / buffer to current row /
    MEM_ROOT field_alloc;
    unsigned int field_count, current_field;
    my_bool eof; / Used by mysql_fetch_row /
    / mysql_stmt_close() had to cancel this result /
    my_bool unbuffered_fetch_cancelled;
    void *extension;
    } MYSQL_RES;

MySQL 有如下C语言API:

函数

描述

mysql_affected_rows()

返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。

mysql_autocommit()

切换 autocommit模式,ON/OFF

mysql_change_user()

更改打开连接上的用户和数据库。

mysql_charset_name()

返回用于连接的默认字符集的名称。

mysql_close()

关闭服务器连接。

mysql_commit()

提交事务。

mysql_connect()

连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。

mysql_create_db()

创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。

mysql_data_seek()

在查询结果集中查找属性行编号。

mysql_debug()

用给定的字符串执行DBUG_PUSH。

mysql_drop_db()

撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。

mysql_dump_debug_info()

让服务器将调试信息写入日志。

mysql_eof()

确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。

mysql_errno()

返回上次调用的MySQL函数的错误编号。

mysql_error()

返回上次调用的MySQL函数的错误消息。

mysql_escape_string()

为了用在SQL语句中,对特殊字符进行转义处理。

mysql_fetch_field()

返回下一个表字段的类型。

mysql_fetch_field_direct()

给定字段编号,返回表字段的类型。

mysql_fetch_fields()

返回所有字段结构的数组。

mysql_fetch_lengths()

返回当前行中所有列的长度。

mysql_fetch_row()

从结果集中获取下一行

mysql_field_seek()

将列光标置于指定的列。

mysql_field_count()

返回上次执行语句的结果列的数目。

mysql_field_tell()

返回上次mysql_fetch_field()所使用字段光标的位置。

mysql_free_result()

释放结果集使用的内存。

mysql_get_client_info()

以字符串形式返回客户端版本信息。

mysql_get_client_version()

以整数形式返回客户端版本信息。

mysql_get_host_info()

返回描述连接的字符串。

mysql_get_server_version()

以整数形式返回服务器的版本号。

mysql_get_proto_info()

返回连接所使用的协议版本。

mysql_get_server_info()

返回服务器的版本号。

mysql_info()

返回关于最近所执行查询的信息。

mysql_init()

获取或初始化MYSQL结构。

mysql_insert_id()

返回上一个查询为AUTO_INCREMENT列生成的ID。

mysql_kill()

杀死给定的线程。

mysql_library_end()

最终确定MySQL C API库。

mysql_library_init()

初始化MySQL C API库。

mysql_list_dbs()

返回与简单正则表达式匹配的数据库名称。

mysql_list_fields()

返回与简单正则表达式匹配的字段名称。

mysql_list_processes()

返回当前服务器线程的列表。

mysql_list_tables()

返回与简单正则表达式匹配的表名。

mysql_more_results()

检查是否还存在其他结果。

mysql_next_result()

在多语句执行过程中返回/初始化下一个结果。

mysql_num_fields()

返回结果集中的列数。

mysql_num_rows()

返回结果集中的行数。

mysql_options()

为mysql_connect()设置连接选项。

mysql_ping()

检查与服务器的连接是否工作,如有必要重新连接。

mysql_query()

执行指定为“以Null终结的字符串”的SQL查询。

mysql_real_connect()

连接到MySQL服务器。

mysql_real_escape_string()

考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。

mysql_real_query()

执行指定为计数字符串的SQL查询。

mysql_refresh()

刷新或复位表和高速缓冲。

mysql_reload()

通知服务器再次加载授权表。

mysql_rollback()

回滚事务。

mysql_row_seek()

使用从mysql_row_tell()返回的值,查找结果集中的行偏移。

mysql_row_tell()

返回行光标位置。

mysql_select_db()

选择数据库。

mysql_server_end()

最终确定嵌入式服务器库。

mysql_server_init()

初始化嵌入式服务器库。

mysql_set_server_option()

为连接设置选项(如多语句)。

mysql_sqlstate()

返回关于上一个错误的SQLSTATE错误代码。

mysql_shutdown()

关闭数据库服务器。

mysql_stat()

以字符串形式返回服务器状态。

mysql_store_result()

检索完整的结果集至客户端。

mysql_thread_id()

返回当前线程ID。

mysql_thread_safe()

如果客户端已编译为线程安全的,返回1。

mysql_use_result()

初始化逐行的结果集检索。

mysql_warning_count()

返回上一个SQL语句的告警数。

与MySQL交互时,应用程序应选用该一般性原则:

  1. 通过调用mysql_library_init(),起首化MySQL库。库能够是mysqlclient
    C客户端库,或mysqld嵌入式服务器库,具体景况取决于应用程序是或不是与“-libmysqlclient”或“-libmysqld”标识链接。

二.
由此调用mysql_init()初阶化连接管理程序,并透过调用mysql_real_connect()连接到服务器。

  1. 产生SQL语句并拍卖其结果。(在底下的座谈中,详细介绍了利用它的方法)。

  2. 通过调用mysql_close(),关闭与MySQL服务器的接连。

  3. 通过调用mysql_library_end(),甘休MySQL库的行使。

 

调用mysql_library_init()和mysql_library_end()的意在,为MySQL库提供合适的起初化和终止管理。对于与客户端库链接的应用程序,它们提供了勘误的内部存款和储蓄器处理作用。假诺不调用mysql_library_永利集团登录网址,end(),内部存款和储蓄器块仍将维持分配处境(那不会扩大应用程序使用的内部存款和储蓄器量,但一些内部存款和储蓄器泄漏质量评定器将对抗它)。对于与嵌入式服务器链接的应用程序,这一个调用会运营并甘休服务器。

mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名目更明亮地指明,无论应用程序使用的是mysqlclient或mysqld库,运行或停止MySQL库时,应调用它们。对于早先时期的MySQL版本,可调用mysql_server_init()和mysql_server_end()代替他。

假设愿意,可回顾对mysql_library_init()的调用,那是因为,须求时,mysql_init()会自行调用它。

要想连接受服务器,可调用mysql_init()来初阶化连接管理程序,然后用该管理程序(以及其余新闻,如主机名、用户名和密码)调用mysql_real_connect()。创设连接后,在低于5.0.三版的API中,mysql_real_connect()会将再连接标识(MYSQL结构的一局地)设置为一,或在较新的版本中,将其设置为0。对于该标记,值“一”指明,假若因连年丢失而不能实行语句,屏弃在此之前,会尝试再一次连接到服务器。从MySQL
5.0.1三发端,能够在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以决定再连接行为。实现连接后,调用mysql_close()中止它。

当连接处于活动状态时,客户端可能会动用mysql_query()或mysql_real_query()向服务器发出SQL查询。两个的差别在于,mysql_query()预期的查询为钦点的、由Null终结的字符串,而myql_real_query()预期的是计数字符串。假使字符串包括二进制数据(在那之中可能包括Null字节),就必须使用mysql_real_squery()。

对此每种非SELECT查询(举个例子INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可窥见有微微行已被转移(影响)。

对此SELECT查询,能够寻觅作为结果集的行。注意,某个语句因其重回行,类似与SELECT。包蕴SHOW、DESC奇骏IBE和EXPLAIN。应服从对待SELECT语句的点子管理它们。

客户端管理结果集的章程有二种。一种方法是,通过调用mysql_store_result(),一回性地搜索整个结果集。该函数能从服务器得到查询重返的有着行,并将它们保存在客户端。第二种艺术是指向客户端的,通过调用mysql_use_result(),对“按行”结果集检索举行初叶化管理。该函数能开始化检索结果,但无法从服务器得到其余实际行。

在那三种状态下,均能由此调用mysql_fetch_row()访问行。通过mysql_store_result(),mysql_fetch_row()能够访问从前从服务器获得的行。通过mysql_use_result(),mysql_fetch_row()能够实际地寻找来自服务器的行。通过调用mysql_fetch_lengths(),能获得有关各行中数据大小的音讯。

产生结果集操作后,申请调离用mysql_free_result()释放结果集应用的内部存款和储蓄器。

这三种检索机制是补偿的。客户端程序应慎选最能满意其供给的不二等秘书技。实际上,客户端最常使用的是mysql_store_result()。

mysql_store_result()的三个亮点在于,由于将行全部领到到了客户端上,你不仅仅能接二连三走访行,仍是能够运用mysql_data_seek()或mysql_row_seek()在结果聚集向前或向后运动,以转移结果集内当前行的岗位。通过调用mysql_num_rows(),还是可以窥见有个别许行。另1方面,对于大的结果集,mysql_store_result()所需的内部存款和储蓄器恐怕会非常的大,你很可能遇到内部存款和储蓄器溢出处境。

mysql_use_result()的一个优点在于,客户端所需的用来结果集的内部存款和储蓄器较少,原因在于,贰遍它仅维护一行(由于分配开支十分的低,mysql_use_result()能越来越快)。它的瑕疵在于,你必须连忙管理每一行防止止妨碍服务器,你不可能随随意便走访结果聚集的行(只好再而三访问行),你不知底结果聚焦有些许行,直至全体探索了它们结束。不止如此,即便在搜寻进程中您认清已找到所寻找的音讯,也非得搜索全体的行。

通过API,客户端能够适合地对查询作出响应(仅在要求时检索行),而不须求理解查询是不是是SELECT查询。能够在历次mysql_query()或mysql_real_query()后,通过调用mysql_store_result()完毕该操作。若是结果集调用成功,查询为SELECT,而且能够读取行。若是结果集调用失利,可调用mysql_field_count()来推断结果是或不是真正是所预期的。如若mysql_field_count()重临0,查询不回去数据(注解它是INSERT、UPDATE、DELETE等),而且不再次来到行。即使mysql_field_count()是非0值,查询应重返行,但并未有回来行。那注脚查询是没戏了的SELECT。关于怎么样落实该操作的言传身教,请参见关于mysql_field_count()的介绍。

无论是mysql_store_result()还是mysql_use_result(),均同意你收获有关构成结果集的字段的音讯(字段数目,它们的名称和系列等)。通过重复调用mysql_fetch_田野先生(),能够按顺序访问行内的字段新闻,只怕,通过调用mysql_fetch_field_direct(),能够在行内按字段编号访问字段消息。通过调用mysql_field_seek(),能够退换这段时间字段的光标地方。对字段光标的安装将震慑一而再的mysql_fetch_田野同志()调用。别的,你也能通过调用mysql_fetch_田野(field)s(),壹回性地得到有关字段的持有音信。

为了检查评定和布告错误,MySQL提供了利用mysql_errno()和mysql_error()函数访问错误新闻的编写制定。它们能回到关于近来调用的函数的错误代码或错误消息,近来调用的函数可能得逞也说不定倒闭,那样,你就会决断错误是在何时出现的,以及错误是何许。

壹.连接mysql数据库示例:

#include 
#include 

int main(int argc, const char *argv[])
{
    MYSQL   mysql;

    if (NULL == mysql_init(&mysql)) {    //分配和初始化MYSQL对象
        printf("mysql_init(): %s\n", mysql_error(&mysql));
        return -1;
    }

    //尝试与运行在主机上的MySQL数据库引擎建立连接
    if (NULL == mysql_real_connect(&mysql,
                "localhost",
                "root",
                "shallnet",
                "db_users",
                0,
                NULL,
                0)) {
        printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
        return -1;
    }

    printf("Connected MySQL successful! \n");

    mysql_close(&mysql);
    return 0;
}

上例中接纳函数表明:

MYSQL *mysql_init(MYSQL *mysql) ,
分配或初阶化与mysql_real_connect()相适应的MYSQL对象。假如mysql是NULL指针,该函数将分配、开始化、并重回新指标。不然,将早先化对象,并赶回对象的地点。若是mysql_init()分配了新的靶子,当调用mysql_close()来关闭连接时。将释放该对象。函数再次回到初步化的MYSQL*句柄。假诺无足够内部存款和储蓄器以分配新的对象,重临NULL。

 

MYSQL *永利娱乐,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 long client_flag)

 

mysql_real_connect()尝试与运作在主机上的MySQL数据库引擎创建连接。在你可见实施须求有效MySQL连接句柄结构的其余其余API函数从前,mysql_real_connect()必须成功做到。

 

首先个参数mysql应是已有MYSQL结构的地方。

 

“host”的值必须是主机名或IP地址。借使“host”是NULL或字符串”localhost”,连接将被视为与地面主机的三番五次。

 

“passwd”参数包罗用户的密码。假如“passwd”是NULL,仅会对该用户的(具备二个空密码字段的)用户表中的条规进行相称检查。那样,数据库管理员就会按一定的主意设置MySQL权限系统,依据用户是或不是具有钦赐的密码,用户将拿到分裂的权位。

“db”是数据库名称。倘诺db为NULL,连接会将暗中同意的数据库设为该值。

 

若是“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连年的体系。

 

如果unix_socket不是NULL,该字符串描述了应采取的套接字或命名管道。注意,“host”参数决定了连年的项目。

 

 

client_flag的值一般为0,不过,也能将其安装为下述标记的结合,以允许特定作用:

标志名称

标志描述

CLIENT_COMPRESS

使用压缩协议。

CLIENT_FOUND_ROWS

返回发现的行数(匹配的),而不是受影响的行数。

CLIENT_IGNORE_SPACE

允许在函数名后使用空格。使所有的函数名成为保留字。

CLIENT_INTERACTIVE

关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。

CLIENT_LOCAL_FILES

允许LOAD DATA LOCAL处理功能。

CLIENT_MULTI_STATEMENTS

通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。

CLIENT_MULTI_RESULTS

通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。

CLIENT_NO_SCHEMA

禁止db_name.tbl_name.col_name语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。

CLIENT_ODBC

客户端是ODBC客户端。它将mysqld变得更为ODBC友好。

CLIENT_SSL

使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。

 

1经总是成功,函数再次回到MYSQL*老是句柄。借使总是失利,再次来到NULL。对于成功的一连,再次来到值与第二个参数的值同样。

 

const char *mysql_error(MYSQL *mysql);

对于由mysql钦赐的总是,对于倒闭的目前调用的API函数,mysql_error()再次来到包蕴错误音讯的、由Null终结的字符串。假若该函数未失败,mysql_error()的重回值大概是先前的错误,或指明无不当的空字符串。

经验规则是,倘诺成功,全数向服务器请求音讯的函数均会重新苏醒设置mysql_error()。

下边为编写翻译和举行理并了结果输出:

 

# make
cc -Wall -Werror -O2 -I/usr/include/mysql/   -c -o main.o main.c
Linking target_bin...
# ./target_bin 
Connected MySQL successful!

 

若是有意改错密码,编写翻译链接之后先后输出如下新闻:

 

# ./target_bin
mysql_real_connect(): Access denied for user 'root'@'localhost' (using password: YES)

2.查询数据库示例:

 

#include 
#include 
#include 
int main(int argc, const char *argv[])
{
    MYSQL           mysql;
    MYSQL_RES       *res = NULL;
    MYSQL_ROW       row;
    char            *query_str = NULL;
    int             rc, i, fields;
    int             rows;
    if (NULL == mysql_init(&mysql)) {
        printf("mysql_init(): %s\n", mysql_error(&mysql));
        return -1;
    }
    if (NULL == mysql_real_connect(&mysql,
                "localhost",
                "root",
                "shallnet",
                "db_users",
                0,
                NULL,
                0)) {
        printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
        return -1;
    }
    printf("1. Connected MySQL successful! \n");
    query_str = "select * from tb_users";
    rc = mysql_real_query(&mysql, query_str, strlen(query_str));
    if (0 != rc) {
        printf("mysql_real_query(): %s\n", mysql_error(&mysql));
        return -1;
    }
    res = mysql_store_result(&mysql);
    if (NULL == res) {
         printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
         return -1;
    }
    rows = mysql_num_rows(res);
    printf("The total rows is: %d\n", rows);
    fields = mysql_num_fields(res);
    printf("The total fields is: %d\n", fields);
    while ((row = mysql_fetch_row(res))) {
        for (i = 0; i < fields; i++) {
            printf("%s\t", row[i]);
        }
        printf("\n");
    }
    mysql_close(&mysql);
    return 0;
}

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long
length)

推行由“query”指向的SQL查询,它应是字符串长度字节“long”。不荒谬状态下,字符串必须带有壹条SQL语句,而且不应为语句增添终结分号(‘;’)或“\g”。假如同意多语句实施,字符串可含蓄由支行隔绝的多条语句。

对此富含2进制数据的询问,必须使用mysql_real_query()而不是mysql_query(),这是因为,贰进制数据大概会含有‘\0’字符。此外,mysql_real_query()比mysql_query()快,那是因为它不会在询问字符串上调用strlen()。假设查询成功,函数再次回到0。借使出现错误,函数重返非0值。

MYSQL_RES *mysql_store_result(MYSQL *mysql)

对此成功检索了数码的各样查询(SELECT、SHOW、DESCHavalIBE、EXPLAIN、CHECK
TABLE等),必须调用mysql_store_result()或mysql_use_result()。

对于其他查询,无需调用mysql_store_result()或mysql_use_result(),但是一旦在此外景况下均调用了mysql_store_result(),它也不会促成其他加害或品质降低。通过检查mysql_store_result()是不是再次来到0,可检查实验查询是或不是未有结果集(现在会愈来愈多)。

万一指望了然查询是或不是应重回结果集,可选取mysql_field_count()举办检讨。mysql_store_result()将查询的全方位结果读取到客户端,分配贰个MYSQL_RES结构,并将结果置于该组织中。如果查询未重回结果集,mysql_store_result()将回来Null指针(举个例子,即便查询是INSERT语句)。

借使读取结果集退步,mysql_store_result()还大概会回去Null指针。通过检查mysql_error()是或不是再次回到非空字符串,mysql_errno()是或不是再次来到非0值,或mysql_field_count()是还是不是再次回到0,能够检查是不是现身了错误。要是未回来行,将重返空的结果集。(空结果集设置差异于作为重返值的空指针)。

若果调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来寻觅结果聚焦的行数。

可以调用mysql_fetch_row()来得到结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来收获或安装结果聚焦的当下行任务。

借使成功了对结果集的操作,必须调用mysql_free_result()。

回来具备多个结实的MYSQL_RES结果群集。纵然出现谬误,再次来到NULL。

my_ulonglong mysql_num_rows(MYSQL_RES *result)

函数再次回到结果聚焦的行数,mysql_num_rows()的利用取决于是不是采取了mysql_store_result()或mysql_use_result()来回到结果集。假若应用了mysql_store_result(),能够立时调用mysql_num_rows()。假设采纳了mysql_use_result(),mysql_num_rows()不回去正确的值,直至检索了结果聚焦的有着行甘休,函数结果聚集的行数。

unsigned int mysql_num_fields(MYSQL_RES *result)

要想传递MYSQL*参量取代他,请使用无符号整数mysql_field_count(MYSQL
*mysql)。

函数重回结果集中的列数。注意,你能够从指向结果集的指针或针对连接句柄的指针得到行数。即便mysql_store_result()或mysql_use_result()重临NULL,应采用连接句柄(因此未有结果集指针)。在这一场馆下,可调用mysql_field_count()来判断mysql_store_result()是不是变动了非空结果。那样,客户端程序就能够采取方便的行动,而无需知道查询是不是是SELECT语句(或类似SELECT的说话)。

 

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

招来结果集的下一行。在mysql_store_result()之后选拔时,固然未有要寻觅的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后采纳时,倘若未有要搜索的行或现身了错误,mysql_fetch_row()返回NULL。

行内值的数额由mysql_num_田野先生s(result)给出。要是行中保存了调用mysql_fetch_row()重返的值,将循规蹈矩row[0]到row[mysql_num_fields(result)-1],访问这一个值的指针。行中的NULL值由NULL指针指明。

能够经过调用mysql_fetch_lengths()来收获行中字段值的长度。对于空字段以及带有NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。借使指针为NULL,字段为NULL,不然字段为空。

函数重临下1行的MYSQL_ROW结构。要是未有更加的多要寻觅的行或出现了不当,重临NULL。

void mysql_free_result(MYSQL_RES *result)

该函数释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内部存款和储蓄器。完结对结果集的操作后,必须调用mysql_free_result()释放结果集应用的内部存款和储蓄器。

放出完结后,不要品味访问结果集。

编写翻译链接实施结果如下:

 

# make
cc -Wall -Werror -O2 -I/usr/include/mysql/   -c -o main.o main.c
Linking target_bin...
# ./target_bin 
1. Connected MySQL successful! 
The total rows is: 13
The total fields is: 3
10000   Allen   1981-01-01
10001   Ben     1982-04-02
10002   Curry   1985-08-12
10003   Davis   1978-07-12
10004   Ellis   1979-09-02
10005   Faried  1984-02-05
10007   Hamilton        1988-07-07
10008   Johnson 1986-06-07
10009   Jackson 1989-08-17
10010   James   1984-12-30
10011   Gay     1987-02-03
10012   Kaman   1981-04-04
10006   Wade    1982-03-04

 

插入删除示例:

#include 
#include 
#include 
int main(int argc, const char *argv[])
{
    MYSQL           mysql;
    MYSQL_RES       *res = NULL;
    MYSQL_ROW       row;
    char            *query_str = NULL;
    int             rc, i, fields;
    int             rows;
    if (NULL == mysql_init(&mysql)) {
        printf("mysql_init(): %s\n", mysql_error(&mysql));
        return -1;
    }
    if (NULL == mysql_real_connect(&mysql,
                "localhost",
                "root",
                "shallnet",
                "db_users",
                0,
                NULL,
                0)) {
        printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
        return -1;
    }
    printf("1. Connected MySQL successful! \n");
//执行插入请求
    query_str = "insert into tb_users values (12345, 'justtest', '2015-5-5')";
    rc = mysql_real_query(&mysql, query_str, strlen(query_str));
    if (0 != rc) {
        printf("mysql_real_query(): %s\n", mysql_error(&mysql));
        return -1;
    }
//执行删除请求
    query_str = "delete from tb_users where userid=10006";
    rc = mysql_real_query(&mysql, query_str, strlen(query_str));
    if (0 != rc) {
        printf("mysql_real_query(): %s\n", mysql_error(&mysql));
        return -1;
    }
//然后查询插入删除之后的数据
    query_str = "select * from tb_users";
    rc = mysql_real_query(&mysql, query_str, strlen(query_str));
    if (0 != rc) {
        printf("mysql_real_query(): %s\n", mysql_error(&mysql));
        return -1;
    }
    res = mysql_store_result(&mysql);
    if (NULL == res) {
         printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
         return -1;
    }
    rows = mysql_num_rows(res);
    printf("The total rows is: %d\n", rows);
    fields = mysql_num_fields(res);
    printf("The total fields is: %d\n", fields);
    while ((row = mysql_fetch_row(res))) {
        for (i = 0; i < fields; i++) {
            printf("%s\t", row[i]);
        }
        printf("\n");
    }
    mysql_free_result(res);
    mysql_close(&mysql);
    return 0;
}

编写翻译链接试行结果如下:

 

# make 
cc -Wall -Werror -O2 -I/usr/include/mysql/   -c -o main.o main.c
Linking target_bin...
# ./target_bin
1. Connected MySQL successful!
The total rows is: 13
The total fields is: 3
10000   Allen   1981-01-01
10001   Ben     1982-04-02
10002   Curry   1985-08-12
10003   Davis   1978-07-12
10004   Ellis   1979-09-02
10005   Faried  1984-02-05
10007   Hamilton        1988-07-07
10008   Johnson 1986-06-07
10009   Jackson 1989-08-17
10010   James   1984-12-30
10011   Gay     1987-02-03
10012   Kaman   1981-04-04
12345   justtest        2015-05-05

 

在其实应用中,大家不容许在命令行登入进数据库举办数量的询问、插入等操作,用…

错误处理

错误管理的七个函数:

// 返回错误码
unsigned int mysql_errno(MYSQL *connection);
// 返回错误详细信息
char* mysql_error(MYSQL *connection);

注意,当调用conn = mysql_real_connect(…),
时会碰到三个标题,因为它在波折时回来NULL指针,并未提供三个错误码。但1旦是将句柄作为3个变量,那么尽管mysql_real_connect失败,也坚韧不拔能够管理它。

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"
#include "errmsg.h"
#include "mysqld_error.h"

void Error(MYSQL* conn) {
 printf("Connection error %d: %s\n", mysql_errno(conn), mysql_error(conn));
}

int main (int argc, char *argv[]) {

 MYSQL conn; // 是变量而不是指针

 mysql_init(&conn); // 注意取地址符&

 if (mysql_real_connect(&conn, "192.168.137.246", "root", "123456", "test", 0, NULL, 0)) {
  printf("Connection success!\n");
  mysql_close(&conn);
 } else {
  fprintf(stderr, "Connection failed!\n");
  if (mysql_errno(&conn)) {
   fprintf(stderr, "Connection error %d: %s\n", mysql_errno(&conn), mysql_error(&conn));
  }
 }
 return EXIT_SUCCESS;
}

一:安装MySQL:sudo apt-get install
mysql-server mysql-client 二:安装MySQL开拓包:sudo apt-get install
libmysqlclient15-dev 此时急需运用的头文…

请记住检查希望收获的结果集的调用状态。上面包车型客车代码未有完成那或多或少:
永利集团登录网址 1
噩运地是,假如mysql_store_result() 失败,res_set 为NULL,while
循环也不实施了,应测试重临结果集函数的重返值,以保险实际上在张开职业。

linux程序设计——使用C语言访问MySQL(第八章)

率先保障安装:

一:安装MySQL:sudo apt-get install mysql-server mysql-client
二:安装MySQL开辟包:sudo apt-get install libmysqlclient15-dev
此时内需运用的头文件会冒出在/usr/include/mysql/里

  1. 荒唐1——使用未初…

8.三 使用C语言访问MySQL数据

Windows本地程序(如Access)能够由此ODBC驱动程序来走访MySQL,以至有针对linuxODBC驱动程序。
上面研商使用C语言来做客MySQL.

C语言连接MySQL数据库

此包涵三个步骤: 一. 施用函数mysql_init起先化2个连续句柄结构.
mysql_init的函数定义如下:

MYSQL * mysql_init(MYSQL *);

平日传递NULL给那么些例程,他会回去一个针对性新分配的连接句柄结构的指针。如若传递一个已有的结构,它将会再度初阶化。那么些例程在阴差阳错开上下班时间回来NULL.

  1. 实质上开始展览一连近期只是分配和初步化了一个布局,依然供给运用mysql_real_connect来向3个连连提供参数,
    mysql_real_connect的函数定义:

    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);

指针connection必须指向已经被mysql_init初步化过的布局。

注意server_host既能够是主机名,也足以是IP地址。倘若连接本地,能够制定localhost来优化。

sql_user_name和sql_password的意思和它们的字面意思同样。假如登陆名称叫NULL,则假若登入名叫当前Linux用户的登入ID,假若密码为NULL,则只要密码为空。

port_number和unix_socket_name应该分别为0和NULL,除非您转移了MySQL安装的私下认可设置。他们将暗中同意使用方便的值。

末段,flags参数用来对有的概念的位方式打开OSportage操作,使得更换使用协议的一点特征。

倘使不可能连接,则赶回NULL。mysql_error函数能够提供有帮带的音信。

  1. 应用完连接,日常在程序退出前,要调用函数mysql_close;

mysql_close的函数定义:

void mysql_close(MYSQL *connection);

将关门连接。

连接MySQL的示例:

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

int main (int argc, char *argv[]) {

 MYSQL *conn;

 // 步骤1: 初始化连接句柄
 conn = mysql_init(NULL);

 if (conn == NULL) { // 如果返回NULl说明初始化失败
  printf("mysql_init failed!\n"); 
  return EXIT_FAILURE;
 }

 // 步骤2:实际进行连接
 // 参数分别为,conn连接句柄,host是MySQL所在主机或地址,user用户名,password密码,database_name数据库名,后面的都是默认
 conn = mysql_real_connect(conn, "host", "user", "password", "database_name", 0, NULL, 0);

 if (conn) { // 连接成功
  printf("Connection success!\n"); 
 } else {
  printf("Connection failed!\n"); 
 }

 // 步骤3: 退出前关闭连接
 mysql_close(conn);

 return 0;
}

编写翻译和平运动作:

gcc -I/usr/include/mysql test.c -L/usr/lib/mysql -lmysqlclient -o app

永利集团登录网址 2

相关文章