vc++ mysql

最近項目涉及到vc 和mysql

查到以下一些資料 做個備份 免得以後難查 O(∩_∩)O~

需要注意的是 如果想用mysql 自帶的接口 必須在裝mysql的時候 選擇完全安裝,再把安裝目錄下的libmySQL.dll考到C:/WINDOWS/system32目錄下 不然沒法用(網上很多資料都沒說清楚這點,讓我搞了好久。。。)

 

一、如果已經有可用的MySQL服務器,在VC中可以按照如下方法實現與數據庫的連接。
1、找來MySQL(Win32)安裝目錄下的include文件夾,將其添加到VC頭文件目錄列表中;
(VC2008 -> 工具 -> 選擇 ->項目和解決方案 -> VC++目錄 -> 顯示以下內容的目錄 -> 包含文件 -> 加入此目錄)

2、找來MySQL(Win32)安裝目錄下的lib文件夾,將 其添加到VC庫文件目錄列表中;
(VC2008-> 工具 ->選擇 -> 項目和解決方案 -> VC++目錄 -> 顯示以下內容的目錄 -> 庫文件 -> 加入此目錄,注意是lib/debug或lib/opt)
3、新建一個工程,參考如下代碼:
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")


MYSQL *mysql;

bool main()
{
    unsigned short Port = 3306;
    char *IPAddress = "127.0.0.1";
    char *UserName = "root";
    char *Password = "x198432y";
    char *DBName = "test";
    printf("Start... /n");

  
    //char execsql[500];
    mysql = (MYSQL *)malloc(sizeof(MYSQL));   
    //在某些版本中,不需要該初始化工作,可觀看mysql.H以及readme
    mysql_init(mysql);
    if(mysql == NULL)
    {
        printf("EROR: MySQL mysql init error. /n");
    }

    //連接到指定的數據庫
    mysql = mysql_real_connect(mysql, IPAddress, UserName, Password, NULL, Port, NULL, 0);
    if(!mysql)
    {
        printf("conn fail... /n");
        unsigned int mtint = mysql_errno(mysql);
       
        return FALSE;
    }
 //選擇一個具體的庫
    if(mysql_select_db(mysql, DBName) != 0)
    {
        printf("select db error. /n");
    }

 

 printf("version=%d /n", mysql_get_server_version(mysql));
    mysql_close(mysql);
    printf("End... /n");


 scanf("%d",i);
    return TRUE;
}

、怎樣用c/c++編程連接mysql數據庫
     執行增刪查改。這裏是一個小例子:  
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")

void   exiterr(int   exitcode);
MYSQL *mysql;

bool main()
{
    unsigned short Port = 3306;
    char *IPAddress = "127.0.0.1";
    char *UserName = "root";
    char *Password = "x198432y";
    char *DBName = "test";
    printf("Start... /n");

  
    //char execsql[500];
    mysql = (MYSQL *)malloc(sizeof(MYSQL));   
    //在某些版本中,不需要該初始化工作,可觀看mysql.H以及readme
    mysql_init(mysql);
    if(mysql == NULL)
    {
        printf("EROR: MySQL mysql init error. /n");
    }

    //連接到指定的數據庫
    mysql = mysql_real_connect(mysql, IPAddress, UserName, Password, NULL, Port, NULL, 0);
    if(!mysql)
    {
        printf("conn fail... /n");
        unsigned int mtint = mysql_errno(mysql);
       
        return FALSE;
    }
 //選擇一個具體的庫
    if(mysql_select_db(mysql, DBName) != 0)
    {
        printf("select db error. /n");
    }

 //查詢
 MYSQL_RES* res;  
 MYSQL_ROW  row;

 if(mysql_query(mysql,"SELECT   id,name   FROM   tb_test"))  
  exiterr(3);  
 if(!(res = mysql_store_result(mysql)))  
  exiterr(4);  
 while((row = mysql_fetch_row(res)))  
 {  
  for(int i=0; i<mysql_num_fields(res); i++)    
   printf("%s/n",row[i]);  
 }   
 //清理結果集
 mysql_free_result(res); 

 

 //增
 char   sql[500]="";
 sprintf(sql,"%s","insert into tb_test(name) values('zhangsan')");
 if(mysql_query(mysql,sql))  
  exiterr(4);
 else
  printf("插入成功/n");

 //刪
 sprintf(sql,"%s","delete from tb_test where name='zhangsan'");
 if(mysql_query(mysql,sql))  
  exiterr(5);
 else
  printf("刪除成功/n");
 //改
 sprintf(sql,"%s","update tb_test set name='lisi' where id=1");
 if(mysql_query(mysql,sql))  
  exiterr(6);
 else
  printf("修改成功,%d 行被影響/n",mysql_affected_rows(mysql));


    printf("version=%d /n", mysql_get_server_version(mysql));
    mysql_close(mysql);
    printf("End... /n");

 int i = 0;
 scanf("%d",i);
    return TRUE;
}

void   exiterr(int   exitcode)  
{  
 fprintf(stderr,"%s/n",mysql_error(mysql));  
 exit(exitcode);  
}

 

 

       mysql_query   函數將把查詢送給服務器,如果查詢成功,調用mysql_store_result 函數將分配一個MYSQL_RES   結構並且重新從服務器獲得一個結果集。
       你可以用mysql_fetch_row   函數來查看數據。這樣做你將獲得一個   MYSQL_ROW   指針指向數據中的一行。   MYSQL_ROW   指針是一簡單的字符串數組。所有的數據類型被轉換成字符串送到客戶端。  
      mysql_num_fields函數將告訴你返回的列數。你可以繼續調用mysql_fetch_row直到它返回一個空指針以得到查詢中的每一行。  
        注意在這個例子裏,我們沒有檢查有空指針的列。如果你不使用非空列的表,那麼你必須檢查一個特殊行的列是否爲空。一旦你使用完畢一個結果集,你必須釋放它。這通過   mysql_free_result   來完成。  
       最後調用mysql_close來關閉你和數據庫之間的連接。  
       查看結果集你可以不用調用mysql_fetch_row就查出返回的結果集共有多少行。這由
      int   mysql_num_rows(MYSQL_RES   *result)來完成。  
       改變到被下一個   mysql_fetch_row   調用返回的行,你可以用void   mysql_data_seek(MYSQL_RES   *res,   uint   offset)   改變到任意一行。 獲得更多的信息 你可以使用這幾個額外的函數來找出關於一個查詢的更多的信息,並從服務器獲得這些信息。  
        如果你執行一個UPDATE,   INSERT   或者   DELETE   查詢,你可以用int   mysql_affected_rows   來查出共有多少行數據被你影響到。  
      如果在你的數據庫裏有二進制數據,那麼得知數據的長度將是有用的。unsigned   int   *mysql_fetch_lengths(MYSQL_RES   mysql)   將返回一指出了結果集中每一列 的長度的整型數組。  
    當你插入一個帶有   AUTO_INCREMENT   列的表的時候,你可以用int   mysql_insert_id(MYSQL   mysql)   來查出生成的那一行的ID。  

 

     如發現不支持中文,可能是在創建數據庫的時候 字符集沒選擇gb2312或utf8

然後在代碼里加上 mysql_set_character_set(mysql,"gb2312");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章