VC的MySQL编程
一、在你的程序中使用數(shù)據(jù)庫是不錯的注意。如果已經(jīng)有可用的MySQL服務器,在VC中可以按照如下方法實現(xiàn)與數(shù)據(jù)庫的連接。
1、找來MySQL(Win32)安裝目錄下的include文件夾,將其添加到VC頭文件目錄列表中;
(VC6 -> Options ->?Directories -> 加入此目錄)
(VC2005 ->?工具 ->?選擇 ->項目和解決方案 -> VC++目錄 ->?顯示以下內(nèi)容的目錄 ->?包含文件 -> 加入此目錄)2、找來MySQL(Win32)安裝目錄下的lib文件夾,將?其添加到VC庫文件目錄列表中;
(VC6 -> Options ->?Directories -> 加入此目錄)
(VC2005 ->?工具 ->選擇 ->?項目和解決方案 -> VC++目錄 ->?顯示以下內(nèi)容的目錄 ->?庫文件 -> 加入此目錄,注意是lib/debug或lib/opt)
3、新建一個工程,參考如下代碼:
// mysql.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")
int main(int argc, char* argv[])
{
??? unsigned short Port = 3306;
??? char *IPAddress = "192.168.31.56";
??? char *UserName = "root";
??? char *Password = "";
??? char *DBName = "SAS_1_2_0";
??? printf("Start... ");
?
??? MYSQL *ssock;
??? //char execsql[500];
??? ssock = (MYSQL *)malloc(sizeof(MYSQL));???
??? //在某些版本中,不需要該初始化工作,可觀看mysql.H以及readme
??? mysql_init(ssock);
??? if(ssock == NULL)
??? {
??????? printf("EROR: MySQL ssock init error. ");
??????? return FALSE;
??? }
??? //連接到指定的數(shù)據(jù)庫
??? ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
??? if(!ssock)
??? {
??????? printf("conn fail... ");
??????? //memcpy(eee, mysql_error(ssock), 20);
??????? //fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));
???????
??????? //printf("%c ", eee);
??????? unsigned int mtint = mysql_errno(ssock);
??????? //printf("%d ");
??????? return FALSE;
??? }
??? if(mysql_select_db(ssock, DBName) != 0)
??? {
??????? printf("select db error. ");
??????? return FALSE;
??? }
??? printf("version=%d ", mysql_get_server_version(ssock));
??? //exec my execsql string
??? //sprintf(execsql,"create table girls (name char(10),age int)");
??? //mysql_real_query(ssock,execsql,strlen(execsql));
??? mysql_close(ssock);
??? printf("End... ");
??? return TRUE;
}?
二、怎樣用c/c++編程連接mysql數(shù)據(jù)庫
???? 執(zhí)行一個查詢有以下幾個步驟要做。首先執(zhí)行一個查詢,然后保存結(jié)果,??
?? ? 得到的是一個子集。這里是一個小例子:??
? #include???<stdio.h>??
? #include????
? #include?? <mysql.h>
? MYSQL?? mysql;??
? MYSQL_RES?? *res;??
? MYSQL_ROW?? row;??
? void?? exiterr(int?? exitcode)??
? {??
?????? fprintf(?? stderr,?? "%s/n",?? mysql_error(&mysql)?? );??
????? ?exit(?? exitcode?? );??
? }??
? int?? main()??
? {??
??????? uint?? i?? =?? 0;??
??????? if?? (!(mysql_connect(&mysql,"host","username","password")))????
???????????????? exiterr(1);???
??????? if?? (mysql_select_db(&mysql,"payroll"))??
???????????? ?exiterr(2);???
??????? if?? (mysql_query(&mysql,"SELECT?? name,rate?? FROM?? emp_master"))??
???????????? ?exiterr(3);??
?????? ?if?? (!(res?? =?? mysql_store_result(&mysql)))??
???????????? ?exiterr(4);???
????????while((row?? =?? mysql_fetch_row(res)))?? {??
???????????? for?? (i=0?? ;?? i?? <?? mysql_num_fields(res);?? i++)????
????????????????? printf("%s/n",row[i]);???
????????}??
??????? mysql_free_result(res);??
?????? ?mysql_close(&mysql);??
?? }??
?????? ?mysql_query?? 函數(shù)將把查詢送給服務器,如果查詢成功,調(diào)用mysql_store_result 函數(shù)將分配一個MYSQL_RES?? 結(jié)構(gòu)并且重新從服務器獲得一個結(jié)果集。
?????? 你可以用mysql_fetch_row?? 函數(shù)來查看數(shù)據(jù)。這樣做你將獲得一個?? MYSQL_ROW?? 指針指向數(shù)據(jù)中的一行。?? MYSQL_ROW?? 指針是一簡單的字符串數(shù)組。所有的數(shù)據(jù)類型被轉(zhuǎn)換成字符串送到客戶端。??
????? ? mysql_num_fields函數(shù)將告訴你返回的列數(shù)。你可以繼續(xù)調(diào)用mysql_fetch_row直到它返回一個空指針以得到查詢中的每一行。??
??????? 注意在這個例子里,我們沒有檢查有空指針的列。如果你不使用非空列的表,那么你必須檢查一個特殊行的列是否為空。一旦你使用完畢一個結(jié)果集,你必須釋放它。這通過?? mysql_free_result?? 來完成。??
?????? 最后調(diào)用mysql_close來關閉你和數(shù)據(jù)庫之間的連接。??
?????? 查看結(jié)果集你可以不用調(diào)用mysql_fetch_row就查出返回的結(jié)果集共有多少行。這由
????? int?? mysql_num_rows(MYSQL_RES?? *result)來完成。??
?????? 改變到被下一個?? mysql_fetch_row?? 調(diào)用返回的行,你可以用void?? mysql_data_seek(MYSQL_RES?? *res,?? uint?? offset)?? 改變到任意一行。? 獲得更多的信息 你可以使用這幾個額外的函數(shù)來找出關于一個查詢的更多的信息,并從服務器獲得這些信息。??
??????? 如果你執(zhí)行一個UPDATE,?? INSERT?? 或者?? DELETE?? 查詢,你可以用int?? mysql_affected_rows?? 來查出共有多少行數(shù)據(jù)被你影響到。??
????? ?如果在你的數(shù)據(jù)庫里有二進制數(shù)據(jù),那么得知數(shù)據(jù)的長度將是有用的。unsigned??int?? *mysql_fetch_lengths(MYSQL_RES?? *mysql)?? 將返回一指出了結(jié)果集中每一列 的長度的整型數(shù)組。??
??? ? 當你插入一個帶有?? AUTO_INCREMENT?? 列的表的時候,你可以用int?? mysql_insert_id(MYSQL?? *mysql)?? 來查出生成的那一行的ID。??
======================
int main()
{
?? ?MYSQL mysql;
??? MYSQL_RES * res ;
??? MYSQL_FIELD * fd ;
??? MYSQL_ROW row ;
?? ?int id[10000];
??? double result[10000][8];
?? ?vector<string> v;
??? if(mysql_init(&mysql) == NULL)
??? {
?? ??std::cout<<"init mysql data status fail"<<std::endl;
???? ??return false;
? ?}?
?else
?{
??std::cout<<"init mysql data status success"<<std::endl;
?}
?
?if(NULL == mysql_real_connect(&mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))
?{
??std::cout<<"connect database fail"<<std::endl<<mysql_error(&mysql)<<std::endl;;
??return false;
?}
?else{
??std::cout<<"connect database success"<<std::endl;
?}
?char?? szSqlText[500]="";
?int j = 0;
?sprintf(szSqlText,"%s","select * from data_receive ");
?if (mysql_query( &mysql, szSqlText))
?//進行數(shù)據(jù)檢索
?{
???? //執(zhí)行SQL語句出錯
??cout<<"query error"<<endl;
??mysql_close( &mysql ) ;
??return FALSE ;
?}
??? else
??? {
??res = mysql_store_result( &mysql ) ;
??int i; ??
??while((row?? =?? mysql_fetch_row(res)))?? {?
???id[j] = atoi(row[0]);
??? for?? (i = 1; i < mysql_num_fields(res); i++)??
??? {
???? result[j][i-1] =? atof(row[i]);
??? }
??? j++;
??}
??? }??
??
??
?for(int i = 0 ; i < 10000; i++)
?{
??if(i>=j)
???break;
??char str[10000];
??stringstream ss;
???result[i][0]<<"','"<<result[i][1]<<"','"<<result[i][2]<<"','"<<
???result[i][3]<<"','"<<result[i][4]<<"','"<<result[i][5]<<"','"<<
???result[i][6]<<"','"<<result[i][7]<<"');";
??string s = ss.str();
??v.push_back(s);??
?}
?for(vector<string>::iterator iter = v.begin();? iter != v.end(); ++iter)
?{
??
??if(mysql_query(&mysql,(*iter).c_str())!=0)
??{
???std::cout<<"execute insert syntax fail"<<
?????std::endl<<mysql_error(&mysql)<<endl;
???mysql_close(&mysql);
???return 1;
??}
?}
??? mysql_free_result(res);
??? mysql_close(&mysql);
??? return 0;
}
總結(jié)
以上是生活随笔為你收集整理的VC的MySQL编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果iOS 16照片新功能亮眼:一步实现
- 下一篇: 比亚迪将支持iPhone手机解锁 终于支