您好,登錄后才能下訂單哦!
本篇文章為大家展示了C++中如何連接MySql數(shù)據(jù)庫,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
一、VS2008工程設置工作
首先,建立一個windows應用程序的工程,將C/C++->預處理器->預處理器定義下的_WINDOWS改為_CONSOLE,
將連接器->系統(tǒng)->子系統(tǒng) 選擇為控制臺。
由于我們要使用Mysql的API,并且我們機子上肯定安裝了Mysql數(shù)據(jù)庫,所以我們要將工程的頭文件路徑指向Mysql安裝目錄的同文件mysql.h所在的位置,將連接庫路徑指向libmysql.lib所在的路徑,
在我的機子上,Mysql 的安裝路徑為:C:\Program Files\MySQL\MySQL Server 5.1
我們需要把VS2008的工程中的頭文件路徑和連接庫路徑指向上面的兩個地方:
將x項目屬性頁的C/C++->常規(guī)->附加包含目錄指向:C:\Program Files\MySQL\MySQL Server 5.1\include
將項目屬性頁的鏈接器->常規(guī)->附加庫目錄指向:C:\Program Files\MySQL\MySQL Server 5.1\lib\opt.
將鏈接器->輸入->附加依賴項中添加libmysql.lib。
如果不設置鏈接器->輸入->附加依賴項中添加libmysql.lib,那么會出現(xiàn)如下的錯誤:
1>------ 已啟動全部重新生成: 項目: MySql-Connect, 配置: Debug Win32 ------ 1>正在刪除項目“MySql-Connect”(配置“Debug|Win32”)的中間文件和輸出文件 1>正在編譯... 1>MySql_Connect.cpp 1>x:\編程練習\c-c++\c\mysql_connect.cpp(35) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 參見“scanf”的聲明 1>x:\編程練習\c-c++\c\mysql_connect.cpp(72) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 參見“sprintf”的聲明 1>x:\編程練習\c-c++\c\mysql_connect.cpp(86) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 參見“sprintf”的聲明 1>正在編譯資源清單... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>正在鏈接... 1>LINK : 沒有找到 d:\我的文檔\Visual Studio 2008\Projects\MySql-Connect\Debug\MySql-Connect.exe 或上一個增量鏈接沒有生成它;正在執(zhí)行完全鏈接 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_close@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_free_result@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_num_fields@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_fetch_row@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_store_result@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_error@4,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_real_query@12,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_select_db@8,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_real_connect@32,該符號在函數(shù) _main 中被引用 1>MySql_Connect.obj : error LNK2019: 無法解析的外部符號 _mysql_init@4,該符號在函數(shù) _main 中被引用 1>d:\我的文檔\Visual Studio 2008\Projects\MySql-Connect\Debug\MySql-Connect.exe : fatal error LNK1120: 10 個無法解析的外部命令 1>生成日志保存在“file://d:\我的文檔\Visual Studio 2008\Projects\MySql-Connect\MySql-Connect\Debug\BuildLog.htm” 1>MySql-Connect - 11 個錯誤,3 個警告 ========== 全部重新生成: 成功 0 個,失敗 1 個,跳過 0 個 ==========
二、連接Mysql和從MySql中取出數(shù)據(jù)的API介紹
2.1 mysql_real_connect()
2.1.1 函數(shù)原型:
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)
2.1.2 參數(shù)說明:
? 第一個參數(shù)應該是一個現(xiàn)存MYSQL結(jié)構(gòu)的地址。在調(diào)用mysql_real_connect()之前,你必須調(diào)用mysql_init()初始化MYSQL結(jié)構(gòu)。見下面的例子。
? host值可以是一個主機名或一個IP地址。如果host是NULL或字符串"localhost",假定是到本地主機的一個連接。如果OS支持套接字(Unix)或命名管道(Win32),使用他們而不是TCP/IP與服務器連接。
? user參數(shù)包含用戶的MySQL登錄ID。如果user是NULL,假定是當前用戶。在Unix下,它是當前登錄名。在Windows ODBC下,必須明確地指定當前用戶名字。見16.4 怎樣填寫ODBC管理程序中各種域。
? passwd參數(shù)為user包含口令。如果passwd是NULL,只有在user表中對于有一個空白口令字段的用戶的條目將被檢查一個匹配。這允許數(shù)據(jù)庫主管設置MySQL權(quán)限,使用戶獲得不同的口令,取決于他們是否已經(jīng)指定一個口令。注意:不要試圖在調(diào)用mysql_real_connect()前加密口令;口令加密自動被客戶API處理。
? db是數(shù)據(jù)庫名。如果db不是NULL,連接將缺省數(shù)據(jù)庫設置為這個值。
? 如果port不是0,值對于TCP/IP連接將用作端口號。注意host參數(shù)決定連接的類型。
? 如果unix_socket不是NULL,字符串指定套接字或應該被使用的命名管道。注意host參數(shù)決定連接的類型。
? client_flag值通常是0,但是在很特殊的情況下可以被設置為下列標志的組合:
標志名字 意味著的標志
CLIENT_FOUND_ROWS 返回找到的(匹配的)行數(shù),不是受到影響的行數(shù)。
CLIENT_NO_SCHEMA 不允許db_name.tbl_name.col_name語法。這是為了ODBC;如果你使用該語法,導致語法分析器產(chǎn)生一個錯誤,它是為在一些ODBC程序捕捉錯誤是有用的。
CLIENT_COMPRESS 使用壓縮協(xié)議。
CLIENT_ODBC 客戶是一個ODBC客戶。這使mysqld變得對ODBC更友好。
2.1.3 返回值
如果連接成功,一個 MYSQL*連接句柄。如果連接失敗,NULL。對一個成功的連接,返回值與第一個參數(shù)值相同,除非你傳遞NULL給該參數(shù)。
2.1.4 錯誤
CR_CONN_HOST_ERROR
不能連接MySQL服務器。
CR_CONNECTION_ERROR
不能連接本地MySQL服務器。
CR_IPSOCK_ERROR
不能創(chuàng)建一個IP套接字。
CR_OUT_OF_MEMORY
內(nèi)存溢出。
CR_SOCKET_CREATE_ERROR
不能創(chuàng)建一個Unix套接字。
CR_UNKNOWN_HOST
不能找到主機名的IP地址。
CR_VERSION_ERROR
由于試圖使用一個不同協(xié)議版本的一個客戶庫與一個服務器連接導致的一個協(xié)議失配。如果你使用一個非常老的客戶庫連接一個沒有使用--old-protocol選項啟動的新服務器,這就能發(fā)生。
CR_NAMEDPIPEOPEN_ERROR;
不能在 Win32 上創(chuàng)建一個命名管道。
CR_NAMEDPIPEWAIT_ERROR;
不能在 Win32 上等待一個命名管道。
CR_NAMEDPIPESETSTATE_ERROR;
不能在 Win32 上得到一個管道處理器。
2.2 mysql_select_db()
2.2.1 函數(shù)原型
int mysql_select_db(MYSQL *mysql, const char *db)
2.2.2 參數(shù)說明
使得由db指定的數(shù)據(jù)庫成為 在由mysql指定的連接上的缺省(當前)數(shù)據(jù)庫。在隨后的查詢中,這個數(shù)據(jù)庫對于不包括一個顯式的數(shù)據(jù)庫指定符的表的引用是缺省數(shù)據(jù)庫。
除非連接的用戶能被認證允許使用數(shù)據(jù)庫,否則mysql_select_db()失敗。
2.2.3 返回值
成功,零。如果發(fā)生一個錯誤,非零。
2.2.4 錯誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當?shù)拇涡虮粓?zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務器關(guān)閉了。
CR_SERVER_LOST
對服務器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個未知的錯誤。
2.3 mysql_real_query
2.3.1 函數(shù)原型
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
2.3.2 參數(shù)說明
執(zhí)行由query指向的SQL查詢,它應該是一個length個字節(jié)的字符串。查詢必須由一個單個的SQL語句組成。你不應該在語句后增加一個終止的分號(“;”)或\g。
對于包含二進制數(shù)據(jù)的查詢,你必須使用mysql_real_query()而不是mysql_query(),因為二進制代碼數(shù)據(jù)可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因為它對查詢字符串調(diào)用strlen()。
2.3.3 返回值
如果查詢成功,零。如果發(fā)生一個錯誤,非零。
2.3.4 錯誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當?shù)拇涡虮粓?zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務器關(guān)閉了。
CR_SERVER_LOST
對服務器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個未知的錯誤。
2.4 mysql_store_result
2.4.1 函數(shù)原型
MYSQL_RES *mysql_store_result(MYSQL *mysql)
2.4.2 返回值
A MYSQL_RES result structure with the results. NULL (0) if an error occurred.
2.5 mysql_fetch_row()
Description
Retrieves the next row of a result set. When used after mysql_store_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve. When used after mysql_use_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an error occurred.
The number of values in the row is given by mysql_num_fields(result). If row holds the return value from a call tomysql_fetch_row(), pointers to the values are accessed as row[0] to row[mysql_num_fields(result)-1]. NULL values in the row are indicated by NULL pointers.
The lengths of the field values in the row may be obtained by calling mysql_fetch_lengths(). Empty fields and fields containing NULL both have length 0; you can distinguish these by checking the pointer for the field value. If the pointer is NULL, the field is NULL; otherwise, the field is empty.
A MYSQL_ROW structure for the next row. NULL if there are no more rows to retrieve or if an error occurred.
Note that error is not reset between calls to mysql_fetch_row()
CR_SERVER_LOST
The connection to the server was lost during the query.
CR_UNKNOWN_ERROR
An unknown error occurred.
參考資料:http://dev.mysql.com/doc/refman/5.6/en/index.html
三、利用Mysql庫提供的API編寫連接Mysql和從Mysql中取出數(shù)據(jù)的代碼
#include <windows.h> #include "stdio.h" #include "winsock.h" #include "mysql.h" int main() { MYSQL * con; //= mysql_init((MYSQL*) 0); MYSQL_RES *res; MYSQL_ROW row; char tmp[400]; //database configuartion char dbuser[30]="root"; char dbpasswd[30]="apple"; char dbip[30]="localhost"; char dbname[50]="excel"; char tablename[50]="test"; char *query=NULL; int x; int y; int rt;//return value unsigned int t; int count = 0; printf("input x,y\n"); scanf("%d,%d",&x,&y); fflush(stdin); printf("input over\n"); con = mysql_init((MYSQL*) 0); if ( con !=NULL && mysql_real_connect(con,dbip,dbuser,dbpasswd,dbname,3306/*TCP IP端口*/,NULL/*Unix Socket 連接類型*/,0/*運行成ODBC數(shù)據(jù)庫標志*/) ) { if (!mysql_select_db(con,dbname)) { printf("Select successfully the database!\n"); con ->reconnect = 1; query = "set names \'GBK\'"; //mysql_query(con,"set names \'GBK\'"); rt=mysql_real_query(con,query,strlen(query)); if (rt) { printf("Error making query: %s !!!\n",mysql_error(con)); } else { printf("query %s succeed!\n",query); } } } else { MessageBoxA(NULL,"Unable to connect the database,check your configuration!","",NULL); } //sprintf(tmp,"update %s set 商品=\'%s\',賣出=%d,成交=%d,漲跌=%d,買進=%d,總量=%d,漲幅=%f,時間=\'%s\' where %s",tablename,goods,sold,deal,fluctuate,buy,total,delta,time,UpdateCon); sprintf(tmp,"insert into %s values(%s,%d,%d)",tablename,"null",x,y); //注意如何向具有自增字段的數(shù)據(jù)庫中插入記錄 //MessageBoxA(NULL,tmp,tmp,MB_OK); //mysql_query(con,tmp); rt=mysql_real_query(con,tmp,strlen(tmp)); if (rt) { printf("Error making query: %s !!!\n",mysql_error(con)); } else { printf("%s executed!!!\n",tmp); } sprintf(tmp,"select * from %s",tablename); rt=mysql_real_query(con,tmp,strlen(tmp)); if (rt) { printf("Error making query: %s !!!\n",mysql_error(con)); } else { printf("%s executed!!!\n",tmp); } res = mysql_store_result(con);//將結(jié)果保存在res結(jié)構(gòu)體中 while(row = mysql_fetch_row(res)) { /** * MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); * 檢索行 */ for(t=0;t<mysql_num_fields(res);t++) { printf("%s ",row[t]); } printf(".............\n"); count ++; } printf("number of rows %d\n",count); printf("mysql_free_result...\n"); mysql_free_result(res); mysql_close(con); return 0; }
四、運行結(jié)果
五、數(shù)據(jù)庫腳本
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50141
Source Host : localhost:3306
Source Database : excel
Target Server Type : MYSQL
Target Server Version : 50141
File Encoding : 65001
Date: 2011-09-23 10:41:43
*/
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `test` -- ---------------------------- DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `x` bigint(4) NOT NULL AUTO_INCREMENT, `y` int(4) DEFAULT NULL, `z` int(4) DEFAULT NULL, PRIMARY KEY (`x`) ) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of test -- ---------------------------- INSERT INTO `test` VALUES ('95', '12432', '4334'); INSERT INTO `test` VALUES ('96', '213', '321'); INSERT INTO `test` VALUES ('97', '213', '213'); INSERT INTO `test` VALUES ('98', '123', '231'); INSERT INTO `test` VALUES ('99', '321', '231'); INSERT INTO `test` VALUES ('100', '123', '32132'); INSERT INTO `test` VALUES ('101', '777', '32213'); INSERT INTO `test` VALUES ('102', '123', '213'); INSERT INTO `test` VALUES ('103', '21', '321'); INSERT INTO `test` VALUES ('104', '324', '432'); INSERT INTO `test` VALUES ('105', '132', '231'); INSERT INTO `test` VALUES ('106', '324', '342'); INSERT INTO `test` VALUES ('107', '23', '23'); INSERT INTO `test` VALUES ('108', '12', '21'); INSERT INTO `test` VALUES ('109', '231', '321'); INSERT INTO `test` VALUES ('110', '123', '231'); INSERT INTO `test` VALUES ('111', '123', '231'); INSERT INTO `test` VALUES ('112', '123', '123'); INSERT INTO `test` VALUES ('113', '312', '231'); INSERT INTO `test` VALUES ('114', '312', '321'); INSERT INTO `test` VALUES ('115', '23', '3'); INSERT INTO `test` VALUES ('116', '213', '312'); INSERT INTO `test` VALUES ('117', '2', '3'); -- ---------------------------- -- Table structure for `xqdata` -- ---------------------------- DROP TABLE IF EXISTS `xqdata`; CREATE TABLE `xqdata` ( `代碼` varchar(20) NOT NULL DEFAULT '', `商品` varchar(20) CHARACTER SET utf8 DEFAULT NULL, `賣出` bigint(20) DEFAULT NULL, `成交` bigint(20) DEFAULT NULL, `漲跌` bigint(20) DEFAULT NULL, `買進` bigint(20) DEFAULT NULL, `總量` bigint(20) DEFAULT NULL, `漲幅` double DEFAULT NULL, `時間` time DEFAULT NULL, PRIMARY KEY (`代碼`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of xqdata -- ---------------------------- INSERT INTO `xqdata` VALUES ('FITX*1', '商品', '34', '43', '23', '34', '0', '1.4', '13:23:08');
上述內(nèi)容就是C++中如何連接MySql數(shù)據(jù)庫,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。