最近項目涉及到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");