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

[PHP] linux程序设计使用C语言访问MySQL(第八章)_MySQL

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2017-5-12 16:11:00 | 显示全部楼层 |阅读模式
    8.3 使用C语言访问MySQL数据 Windows本地程序(如Access)可以通过ODBC驱动程序来访问MySQL,甚至有针对linuxODBC驱动程序。
    下面讨论使用C语言来访问MySQL.
    8.3.1 连接例程 用C语言连接MySQL数据库包含两个步骤:
    1.初始化一个连接句柄结构
    2.实际进行连接

    首先,使用mysql_init来初始化连接句柄
    #include
    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,则假设登录名为当前linux用户的登录ID。如果密码是NULL,则只能访问服务器上无需密码就可访问的数据。密码会在通过传输前进行加密。
    port_number和unix_socket_name应该分别为0和NULL,除非改变了MYSQL安装的默认设置。
    flag参数用来对一些定义的位模式进行OR操作,使得改变使用协议的某些特征。
    如果无法连接,它将返回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 * 每次连接建立后发送的命令
    如果要设置连接超时时间为7秒,使用的代码片段如下所示:
    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...)
    接下来使用一个简短的程序测试一下。
    首先进入rick用户,创建一个数据库foo;
    mysql -u rick -p
    CREATE DATABASE foo;
    如果直接在mysql命令行中输入许多创建表和添加数据的命令,这比较容易出错,而且如果再次输入这些命令的话,也很不高效。因此,创建一个包含所需要命令的文件。
    这个文件名为create_children.sql;
    \. /绝对路径/create_children.sql 来执行这个文件
    一定要使用create_children.sql的绝对路径
    .
    现在有一个用户,一个数据库和一个保存了一些数据的表,接下来看一下如果通过代码来访问这些数据。
    编写程序connect1.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是库文件路径

    8.3.2 错误处理 MySQL使用一系列由连接句柄结构报告的返回码.两个必备的例程是:
    unsigned int mysql_errno(MYSQL *connection);
    char *mysql_error(MYSQL *connection)
    ;
    可以通过调用mysql_errno并传递连接结构来获得错误码,它通常都是非0值.如果未设定错误码,它将返回0.
    mysql_errno的返回值实际上就是错误码,它们在errmsg.h或者mysqld_error.h中定义,前者是报告客户端错误,后者关注服务端错误.mysql_error提供有意义的文本信息,而不是单调的错误码,这些信息被写入一些内部静态内存空间中,如果想保存错误文本,需要把它复制到别的地方.
    当调用mysql_real_connect时会遇到一个问题,因为它在失败时返回NULL指针,并没有提供一个错误码.但如果将连接句柄作为一个变量,那么及时mysql_real_connect失败,仍然能够处理它.
    编写程序connect2.c,它示例如何使用非动态分配的连接结构,以及如何编写一些基本的错误处理代码.
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表