天天看點

C語言操作mysql範例(增删查改)

1 C語言連接配接mysql簡介

    C代碼的API是随MySQL一起釋出的. 它包含在mysqlclient庫中, 可以使C程式來通路資料庫.

    MySQL源碼包中的許多用戶端都是用C寫的. 如果你正在找使用這些C API的例子, 可以看看用戶端的寫法.你可以在MySQL源碼包的clients目錄找到這些例子.

2 測試環境

    作業系統:Red Hat Enterprise Linux Server release 6.4 

    mysql版本:mysql-5.5.28

3 程式設計執行個體

#include <stdio.h>
#include "/usr/local/mysql/include/mysql.h"
void printResult(MYSQL *mysql);
int main()
{
    MYSQL mysql;
    MYSQL_RES * result;
    mysql_init(&mysql);
    mysql_real_connect(&mysql, "127.0.0.1", "root", "jesse", NULL, 3355, NULL, 0); 
    mysql_query(&mysql, "set names 'utf8'");
    mysql_query(&mysql, "drop database if exists tmpdb");
    mysql_query(&mysql, "create database tmpdb");
    mysql_query(&mysql, "use tmpdb");
    mysql_query(&mysql, "create table tmptab(c1 int, c2 varchar(20), c3 varchar(20))");
    mysql_query(&mysql, "insert into tmptab values(101, '姓名1', 'address1'), (102, '姓名2', 'address2'), (103, '姓名3', 'address3')");
    mysql_query(&mysql, "select * from tmptab");
    printf("--增加資料測試--\n");
    printResult(&mysql);
    mysql_query(&mysql, "delete from tmptab where c1 = 101");
    mysql_query(&mysql, "select * from tmptab");
    printf("--删除資料測試--\n");
    printResult(&mysql);
    mysql_query(&mysql, "update tmptab set c3 = 'address4' where c1 = 103");
    mysql_query(&mysql, "select * from tmptab");
    printf("--更新資料測試--\n");
    printResult(&mysql);
    mysql_query(&mysql, "delete from tmptab");
    mysql_query(&mysql, "select * from tmptab");
    printf("--清空資料測試--\n");
    printResult(&mysql);
    mysql_query(&mysql, "drop table tmptab");    
    mysql_query(&mysql, "drop database tmpdb");
    mysql_close(&mysql);
}
void printResult(MYSQL *mysqlPrint)//列印結果集(此處傳入指針,而非内容)
{
    MYSQL_RES * result;
    int numFields = 0;
    int numRows = 0;
    MYSQL_FIELD * field;
    MYSQL_ROW row;
    int i = 0;
    result = mysql_store_result(mysqlPrint);//将查詢的全部結果讀取到用戶端
    numFields = mysql_num_fields(result);//統計結果集中的字段數
    numRows = mysql_num_rows(result);//統計結果集的行數
    while(field = mysql_fetch_field(result))//傳回結果集中的列資訊(字段)
        printf("%s\t", field->name);
    printf("\n");
    if(result)
    {
        while(row = mysql_fetch_row(result))//傳回結果集中行的記錄
        {
            for(i = 0; i < numFields; i++)
            {
                printf("%s\t", row[i]);
            }
            printf("\n");
        }
    }
    mysql_free_result(result);//釋放result空間,避免記憶體洩漏
}
           

4 編譯與運作

    4.1 擷取編譯依賴資訊

[[email protected] /]# mysql_config --cflags
-I/usr/local/mysql/include  -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1
[[email protected] /]# mysql_config --libs
-L/usr/local/mysql/lib -lmysqlclient -lpthread -lm -lrt -ldl
           

    mysql_config --cflags  編譯器标志,用于查找包含檔案,以及編譯libmysqlclient庫時所要使用的關鍵編譯器标志和定義。

    mysql_config --libs  與MySQL用戶端庫進行連結所需的庫和選項。

    4.2 編譯源檔案

[[email protected] /]# gcc -o MysqlCTest MysqlCTest.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient
           

    4.3 執行編譯好的檔案

[[email protected] /]# ./MysqlCTest   
--增加資料測試--
c1      c2      c3
101     姓名1   address1
102     姓名2   address2
103     姓名3   address3
--删除資料測試--
c1      c2      c3
102     姓名2   address2
103     姓名3   address3
--更新資料測試--
c1      c2      c3
102     姓名2   address2
103     姓名3   address4
--清空資料測試--
c1      c2      c3
           

5 補充知識

    5.1 避免中文亂碼

    為確定程式寫入資料庫以及從資料庫讀出時不出現亂碼,需要做如下配置:

    c用戶端程式級别:

    c程式檔案設定編碼 utf8,如

mysql_query(&mysql, "set names 'utf8'");
           

    mysql資料庫級别:

    設定MySQL資料庫用戶端及服務端配置為utf8 

    例如:

    在my.cnf配置檔案中配置

[mysql]  
default_character_set=utf8  
[mysqld]  
character-set-server=utf8  
collation-server=utf8_bin 
           

****************************************************************************************

    原文位址:http://blog.csdn.net/jesseyoung/article/details/40372047

    部落格首頁:http://blog.csdn.net/jesseyoung

****************************************************************************************

繼續閱讀