zoukankan      html  css  js  c++  java
  • 数据库 数据库编程一

    连接到数据库
    mysql_init(MYSQL *pmysql);
    MYSQL *mysql_real_connect(MYSQL * pmysql,const char * hostname,const char *usename,const char *passwd,const char *dbname,0,0,0);
    连接到MySQL必须先调用mysql_init初始化
    之后调用mysql_real_connect连接到数据库
    mysql_real_connect成功返回指向MySQL连接的指针,失败返回NULL;
    执行SQL语句
    int mysql_query(MYSQL *pmysql,const char *sql);
    参数pmysql是连接到mySQL的指针。
    参数sql是要执行的SQL语句。
    成功返回0,失败返回非0。
    Linux下,printf函数必须以'
    '结尾才可以输出到屏幕,如果没有'
    '直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),这里可以使用write函数代替。
    //数据库编程
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "mysql/mysql.h"
    
    #define GTC_DEBUG
    
    #ifdef GTC_DEBUG
    #define GTC_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__); fprintf(stderr, "
    ")
    #else
    #define GTC_LOG(format,...)
    #endif
    
    /*
     * mysql编程步骤
     * 第一步:头文件 #include "mysql/mysql.h"
     * 第二步:makefile文件链接时添加动态库-lmysqlclient
     *
     *
     * 数据库client与server之间也是采用TCP/IP协议
     * 1.初始化client
     * 2.建立连接
     * 3.client向server发送SQL语句,server将执行SQL语句的结果返回client
     * 4.断开连接
     * */
    
    int test()
    {
        int errCode = 0;
        MYSQL *handler = NULL;
    
        /*
        知识补充:
            在一个非多线程的环境中,调用mysql_library_init()可能可以省略,因为 mysql_init()将在必要的时候自动调用它。
            然而mysql_library_init()在多线程环境中并不是安全的,mysql_init()自动调用mysql_library_init()时也同样不安全。
            因此,要么你在增加任何线程之前调用mysql_library_init(),要么使用mutex来保护这个调用(不管是直接调用mysql_library_init()
    还是间接通过调用mysql_init()调用)。 这个步骤必须在任何其他客户端库调用之前完成。
    */ //1.全局初始化 mysql_library_init(0, NULL, NULL); do { /* 知识补充: 配或初始化与mysql_real_connect()相适应的MYSQL对象 如果mysql是NULL指针,该函数将分配、初始化、并返回新对象(即系统分配内存) 否则,将初始化对象,并返回对象的地址(即用户自己分配了内存) 如果mysql_init()是由系统分配内存,当调用mysql_close()来关闭连接时。将释放该内存 注意:如果是用户分配了内存,返回的对象就是用户定义变量的地址 */ //2.初始化句柄 handler = mysql_init(NULL); if (NULL == handler) { errCode = -1; GTC_LOG("fail: mysql_init"); break; } /* 知识补充: 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。 对于成功的连接,返回值与第1个参数的值相同。 */ //3.连接数据库 if (NULL == mysql_real_connect(handler, "192.168.88.120", "root", "ynt#123456", "transaction", 3306, NULL, 0)) { errCode = -1; GTC_LOG("mysql: %s", mysql_error(handler)); break; } { // 4.设置自动重连 my_bool reconnect = 1; mysql_options(handler, MYSQL_OPT_RECONNECT, &reconnect); } //5.设置数据库连接(重要,如果不执行这个SQL语句,mysql不知道需要访问的数据库) mysql_select_db(handler, "transaction"); //6.字符集设置(重要,如果不执行这个SQL语句,数据库不能识别用户输入的sql语句中的中文) mysql_set_character_set(handler, "utf8mb4"); //7.数据库操作 } while (0); //资源释放 if (handler) { mysql_close(handler); handler = NULL; } //全局资源释放(重要,如果不执行mysql_library_end(),将会有部分资源不会被释放) mysql_library_end(); return errCode; } int main(int arg, char *args[]) { test(); printf("------ok----- "); return 0; }
    mysql C语音API进行远程数据查询时,对sql语句的长度有限制,会报的错误经常是语法错误
    例如
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right 
    syntax to use near 'DROP TABLE default_gh11_1;DROP TABLE default_gh11_10;DROP TABLE d
    执行SELECT语句得到查询结果
    MYSQL_RES *mysql_store_result(MYSQL *pmysql);
    成功返回一个查询结果指针,查询无结果或者错误返回NULL。
    mysql_free_result(MYSQL_RES *res)
    调用完mysql_store_result,一定要用mysql_free_result释放相关的资源。
    查看查询结果
    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    例子
    while(row=mysql_fetch_row(result)!=NULL)
    {
        printf("name:%s,sec:%s,age:%s,class:%s
    ",row[0],row[1],row[2],row[3]);
    }
    尽管在表中age是数字,但是Mysql返回的只不过是以NULL结尾的字符串
    //数据库编程
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <mysql/mysql.h>
    
    int main(int arg, char *args[])
    {
        MYSQL mysql, *connection;
    
        mysql_init(&mysql);
        connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
                "db1", 0, 0, 0);
        if (connection == NULL)
        {
            /*mysql_error()打印错误原因*/
            printf("mysql_real_connect() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        /*执行任何mysql都必须设置字符集*/
        if (mysql_query(connection, "SET NAMES utf8") != 0)
        {
            printf("SET NAMES failed! 
    ");
        }
        /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
        if (mysql_query(connection, "SELECT * FROM table1") != 0)
        {
            printf("SELECT failed! 
    ");
        }
        /*
         * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
         * */
        MYSQL_RES *result = mysql_store_result(connection);
        if(result==NULL)
        {
            printf("mysql_store_result() failed! 
    ");
        }
        MYSQL_ROW row ;
        while(1)
        {
            row= mysql_fetch_row(result);
            if(row==NULL) break;
            printf("name:%s;sex:%s;age:%s;class:%s
    ", row[0], row[1], row[2], row[3]);
        }
        //释放相关资源
        mysql_free_result(result);
        mysql_close(connection);
        return 0;
    }
    查看查询结果中的字段信息
    MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
    例子
    while(sqlfield=mysql_fetch_field(result)!=NULL)
    {
        printf("%s
    ",sqlfield->name);
    }
    //数据库编程
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <mysql/mysql.h>
    
    int main(int arg, char *args[])
    {
        MYSQL mysql, *connection;
    
        mysql_init(&mysql);
        connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
                "db1", 0, 0, 0);
        if (connection == NULL)
        {
            /*mysql_error()打印错误原因*/
            printf("mysql_real_connect() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        /*执行任何mysql都必须设置字符集*/
        if (mysql_query(connection, "SET NAMES utf8") != 0)
        {
            printf("SET NAMES failed! 
    ");
        }
        /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
        if (mysql_query(connection, "SELECT * FROM table1") != 0)
        {
            printf("SELECT failed! 
    ");
        }
        /*
         * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
         * */
        MYSQL_RES *result = mysql_store_result(connection);
        if(result==NULL)
        {
            printf("mysql_store_result() failed! 
    ");
        }
        /*这里的列是指SELECT查询结果的列,并非是指表所对应的列*/
        MYSQL_FIELD *field ;
        while(1)
        {
            field= mysql_fetch_field(result);
            if(field==NULL) break;
            printf("name=%s
    ",field->name);
        }
        //释放相关资源
        mysql_free_result(result);
        mysql_close(connection);
        return 0;
    }
  • 相关阅读:
    Ubuntu下MySQL
    submit踩的坑
    转发,重定向以及区别和简单的session对象(转)
    Markdown链接打开新页面而非本页面跳转,补:target属性
    登录失败使用session传数据
    git安装连接码云提交
    Markdown的超链接由新窗口打开
    GitHub搜索相关项目
    mysql安装
    jdk的安装和配置
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6044660.html
Copyright © 2011-2022 走看看