程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C連接MySQL數據庫開發之Linux環境完整示例演示(增、刪、改、查)

C連接MySQL數據庫開發之Linux環境完整示例演示(增、刪、改、查)

編輯:關於C語言

一、開發環境


ReadHat6.3 32位、mysql5.6.15、gcc4.4.6


二、編譯


gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient main.c -o main.out

-I:指定mysql頭文件所在目錄(默認去/usr/include目錄下尋找所用到的頭文件)

-L:指定mysql動態庫文件所在目錄(默認從/usr/lib目錄查找)

-l:鏈接libmysqlclient.so動態庫

-o:生成的可執行文件名


三、完整示例

//
//  main.c
//  mysql數據庫編程
//
//  Created by YangXin on 14-5-22.
//  Copyright (c) 2014年 yangxin. All rights reserved.
//

#include 
#include 
#include 
#include 

MYSQL mysql;

// 查詢
int query();
// 修改
int update();
// 添加數據
my_ulonglong add();
// 參數化添加數據
my_ulonglong addByParams();
// 刪除數據
my_ulonglong delete();
// 打印數據庫服務器信息
void printMySqlInfo();

int main(int argc, const char * argv[])
{
    /*連接之前,先用mysql_init初始化MYSQL連接句柄*/
    mysql_init(&mysql);
    
    /*使用mysql_real_connect連接服務器,其參數依次為MYSQL句柄,服務器IP地址,
     登錄mysql的用戶名,密碼,要連接的數據庫等*/
    if(!mysql_real_connect(&mysql, "localhost", "root", "yangxin", "test", 0, NULL, 0)) {
        printf("connecting to Mysql error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -1;
    }else {
        printf("Connected Mysql successful!\n");
    }
    
    printMySqlInfo();
    
    // 設置編碼
    mysql_query(&mysql, "set names utf8");
    
    // 參數化添加數據
    addByParams();
    
    // 查詢
    query();
    
    // 修改
    update();
    
    // 添加
    add();
    
    // 刪除
    delete();
    
    /*關閉連接*/
    mysql_close(&mysql);
    return 0;
}

// 查詢
int query()
{
    int flag, i;
    const char *sql = NULL;
    MYSQL_RES *res = NULL;
    MYSQL_ROW row = NULL;
    MYSQL_FIELD *fields = NULL;
    sql = "select * from t_user" ;
    flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql));
    if (flag) {
        printf("query error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    
     // 將查詢結果讀取到內存當中,如果數據很多的情況會比較耗內存
    res = mysql_store_result(&mysql);
    // res = mysql_use_result(&mysql); // 需要用到的時候,每次從服務器中讀取一行
    
    // 字段數量
    unsigned int field_count = mysql_field_count(&mysql);
    printf("field_cout:%d\n",field_count);
    
    // 查詢總數
    my_ulonglong rows = mysql_num_rows(res);
    printf("%lld\n",rows);
    
    // 獲取所有字段
    fields = mysql_fetch_fields(res);
    for (int i = 0; i < mysql_num_fields(res); i++) {
         printf("%s\t", fields[i].name);
    }
    
    printf("\n");
    
    // 遍歷結果集
    while((row = mysql_fetch_row(res)))
    {
        for (i = 0; i < mysql_num_fields(res); i++)
        {
            printf("%s\t",row[i]);
           
        }
        
        printf("\n");
    }
    
    // 釋放結果集
    mysql_free_result(res);
    
    return 0;
}

// 修改
int update()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "update t_user set name='lisi',age=20 where id=1";
    // 執行SQL指令
    flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql));
    if (flag) {
        printf("update data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return  -1;
    }
    
    printf("update success.\n");
    
    return 0;
}

// 添加
my_ulonglong add()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "insert into t_user(name,age,address) values ('zhangsan',40,'beijing')";
    // 執行
    flag = mysql_real_query(&mysql, sql, strlen(sql));
    if (flag) {
        printf("add data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    
    // 刪除的行數
    my_ulonglong affected_rows = mysql_affected_rows(&mysql);
    
    // 新添加記錄的ID
    my_ulonglong newid = mysql_insert_id(&mysql);
    
    printf("success add %lld record data, newid:%lld!\n",affected_rows,newid);
    
    return newid;
}

// 參數化添加
my_ulonglong addByParams()
{
    const char *sql = NULL;
    MYSQL_STMT *stmt = NULL;
    MYSQL_BIND bnd[3];  // 占位符參數數量
    memset(&bnd, 0, sizeof(bnd));
    
    // 設置手動提交事務
    //mysql_autocommit(&mysql, 0);
    
    // 通過參數占位符的方式執行SQL
    sql = "insert into t_user(name,age,address) values (?,?,?)";
    
    stmt = mysql_stmt_init(&mysql);
    // 預處理SQL
    if(mysql_stmt_prepare(stmt, sql, (unsigned int)strlen(sql)))
    {
        fprintf(stderr, "mysql_stmt_prepare faild:%d from %s\n",
                mysql_stmt_errno(stmt),mysql_stmt_error(stmt));
        return -1;
    }
    
    // 封裝占位符數據
    const char *name = "hanzhiqiang";
    bnd[0].buffer = (void *)name;
    bnd[0].buffer_type = MYSQL_TYPE_STRING;
    bnd[0].buffer_length = strlen(name);
    
    int age = 30;
    bnd[1].buffer = (void *)&age;
    bnd[1].buffer_length = sizeof(int);
    bnd[1].buffer_type = MYSQL_TYPE_LONG;
    
    const char *addres = "heimuer";
    bnd[2].buffer = (void *)addres;
    bnd[2].buffer_length = strlen(addres);
    bnd[2].buffer_type = MYSQL_TYPE_STRING;
    
    // 綁定占位符參數值
    if(mysql_stmt_bind_param(stmt, bnd))
    {
        fprintf(stderr, "mysql_stmt_bind_param faild:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -2;
    }
    
    // 執行SQL
    if (mysql_stmt_execute(stmt)) {
        fprintf(stderr, "mysql_stmt_execute faild:%d from %s\n", mysql_errno(&mysql), mysql_error(&mysql));
        return -3;
    }
    
    // 關閉statement
    mysql_stmt_close(stmt);
    
    // 提交事務
    //mysql_commit(&mysql);
    
    // 事務回滾(在提交事務前)執行
    // mysql_rollback(&mysql);
    
    // 獲取插入數據後,數據庫受影響的記錄數
    my_ulonglong newid = mysql_stmt_insert_id(stmt);
    printf("參數化語句插入新記錄的id: %lld\n",newid);
    
    // 受影響的行數
    my_ulonglong affectedrows = mysql_stmt_affected_rows(stmt);
    printf("參數化語句插入受影響的行數:%lld\n",affectedrows);
    
    return newid;
}

my_ulonglong delete()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "delete from t_user where id > 10";
    flag = mysql_real_query(&mysql, sql, strlen(sql));
    if (flag) {
        printf("delete data error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -1;
    }
    
    my_ulonglong affected_rows = mysql_affected_rows(&mysql);
    printf("刪除的行數:%lld\n",affected_rows);
    
    printf("success delete %lld record data !\n",affected_rows);
    return affected_rows;
}

void printMySqlInfo()
{
    const char *stat = mysql_stat(&mysql);
    const char *server_info = mysql_get_server_info(&mysql);
    const char *clientInfo = mysql_get_client_info();
    unsigned long version =	mysql_get_client_version();
    const char *hostinfo =	mysql_get_host_info(&mysql);
    unsigned long serverversion = mysql_get_server_version(&mysql);
    unsigned int protoinfo = mysql_get_proto_info(&mysql);
    
    printf("stat:%s\n",stat);
    printf("server_info:%s\n",server_info);
    printf("clientInfo:%s\n",clientInfo);
    printf("version:%ld\n",version);
    printf("hostinfo:%s\n",hostinfo);
    printf("serverversion:%ld\n",serverversion);
    printf("protoinfo:%d\n",protoinfo);
    
    const char *charactername = mysql_character_set_name(&mysql);
    printf("client character set:%s\n",charactername);
    if (!mysql_set_character_set(&mysql, "utf8"))
    {
        printf("New client character set: %s\n",
               mysql_character_set_name(&mysql));
    }
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved