1. 程式人生 > >C++連線mysql資料庫的兩種方法(ADO連線和mysql api連線)

C++連線mysql資料庫的兩種方法(ADO連線和mysql api連線)

【原文 http://www.jb51.net/article/44262.htm 】

現在正做一個介面,通過不同的連線字串操作不同的資料庫。要用到mysql資料庫,C++連線mysql有2種方法:利用ADO連線、利用mysql自己的api函式進行連線,下面看看如何用吧。

第一種方法可以實現我當前的需求,通過連線不同的字串來連線不同的資料庫。暫時只連線了mysql,sqlserver,oracle,access。對於access,因為它建立表的SQL語句不太相容標準SQL語句,需要做一些處理,這裡暫時不說。第二種方法只能針對於mysql資料庫的連線,不過用這種方法不用安裝MyODBC伺服器程式。

不管用哪種方法,首先需要安裝Mysql資料庫,安裝方法請看“mysql安裝及一些注意點”。最好安裝一個Navicat for mysql,方便操作mysql資料庫。下面分別說下這兩種方法:

(一)通過ADO連線MySql資料庫

1、通過ADO連線MySql資料庫,首先得安裝MyODBC伺服器程式。

MyODBC版本要和MySql的版本對應上,否則會連線不上資料庫。我用的版本分別是mysql-5.1.48-win32.msi和mysql-connector-odbc-5.1.5-win32.msi。

安裝好後,點選開始選單->設定->控制面板->管理工具->資料來源(ODBC)->使用者DSN->新增->選擇MySQL ODBC 5.1 Driver。如下圖:

然後雙擊MySQL ODBC 5.1 Driver進行配置。配置好可以點Test進行下測試(如下圖),如果能連上會彈出connection successful對話方塊。

上圖中的Data Source Name:中的內容就是程式碼裡DSN所對應的值。

例如:"DSN=MySqlODBC;server=localhost;database=test"。

2、配置好後,就可以開始編碼了。

(1)首先匯入ADO型別庫。#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")。您的環境中msado15.dll不一定在這個目錄下,請按實際情況修改。或者把msado15.dll這個檔案拷貝到你的工程目錄下,直接#import "msado15.dll" \ no_namespace \rename ("EOF", "adoEOF")包含進來。

(2 )建立Connection物件並連線資料庫

複製程式碼程式碼如下:
{   
CoInitialize(NULL);   
m_pConnection.CreateInstance(__uuidof(Connection));   
try 
{  
//設定連線時間  
m_pConnection->ConnectionTimeout = 5;  
//開啟資料庫連線  
HRESULT hr = m_pConnection->Open("DSN=MySqlODBC;server=localhost;database=test","root","root",adModeUnknown);  
}  
catch(_com_error &e)  
{  
MessageBox(NULL, e.Description(), _T(""), MB_OK);  
return FALSE;  
}   
return TRUE;  
}  
(3)執行SQL語句

BOOL CDBManagerSub::ExecuteSQL( _bstr_t bstrSQL )  
{  
// _variant_t RecordsAffected;  
try 
{  
// 是否已經連線資料庫  
if(m_pConnection == NULL)  
{  
//重新連線資料庫  
Open(m_dbType, m_strServer, m_strUserName, m_strPasswor, m_strDBName);  
}  
// Connection物件的Execute方法:(_bstr_t CommandText,   
// VARIANT * RecordsAffected, long Options )   
// 其中CommandText是命令字串,通常是SQL命令。  
// 引數RecordsAffected是操作完成後所影響的行數,   
// 引數Options表示CommandText的型別:adCmdText-文字命令;adCmdTable-表名  
// adCmdProc-儲存過程;adCmdUnknown-未知  
_RecordsetPtr hr = m_pConnection->Execute(bstrSQL,NULL,adCmdText);  
return true;  
}  
catch(_com_error e)  
{  
MessageBox(NULL, e.Description(), _T(""), MB_OK);  
return false;  
}  
}  


_bstr_t bstrSQL為輸入的SQL語句,如果返回TRUE,則執行成功,返回FLASH則會報對應的錯誤提示。

例如:下面的建立testTable表的SQL語句:

複製程式碼程式碼如下:
char* pQuery = "create table if not exists testTable( ID VARCHAR(10), Name VARCHAR(255),Descs VARCHA(255),PRIMARY KEY (ID))";  
ExecuteSQL(pQuery);  

3、附上mysql資料庫的操作,方便沒有安裝Navicat for mysql的朋友參考。

開啟“開始->所有程式->MySQL->MySQL Server 5.0->MySQL Command Line Client.exe”,如果沒有設定密碼就直接按回車,會提示伺服器啟動成功。

複製程式碼程式碼如下:
mysql> SHOW DATABASES;//顯示所有的資料庫,注意一定要 敲“;”後再按回車  
mysql> CREATE DATABASE mydb;//建立資料庫  
mydbmysql> USE mydb;//選擇你所建立的資料庫  
mydbmysql> SHOW TABLES; //顯示資料庫中的表  
mysql> CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),remark VARCHAR(200),PRIMARY KEY (username));//建立一個表mytable: 使用者名稱;訪問列表,主鍵為username  
mysql> DESCRIBE mytable;//顯示錶的結構

(二)通過MySQL自己的API函式進行連線

1、使用API的方式連線,需要載入mysql的標頭檔案和lib檔案。

在VS2010的附加包含目錄中新增\MySQL\MySQL Server 5.1\include。在安裝MySql的目錄下找。 把libmysql.dll和libmysql.lib檔案拷貝到所建的工程目錄下。然後在標頭檔案裡包含以下內容:

複製程式碼程式碼如下:
//mysql所需的標頭檔案和庫檔案  
#include "winsock.h" 
#include "mysql.h" 
#pragma comment(lib,"libmySQL.lib") 

2、進行編碼

(1)連線mysql資料庫

標頭檔案裡定義資料來源指標 MYSQL m_sqlCon;

複製程式碼程式碼如下:
//連線MySql資料庫

try 
{  
mysql_init(&m_sqlCon);  
// localhost:伺服器 root為賬號密碼 test為資料庫名 3306為埠  
if(!mysql_real_connect(&m_sqlCon, "localhost","root","root","test",3306,NULL,0))  
{  
AfxMessageBox(_T("資料庫連線失敗!"));  
return FALSE;  
}   
return TRUE;  
}  
catch (...)  
{  
return FALSE;  

(2)關閉資料庫

複製程式碼程式碼如下:
mysql_close(&m_sqlCon); 

(3)建立表

複製程式碼程式碼如下:
char* pQuery = "create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))"   
if(mysql_real_query(&m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)  
{   
const char* pCh = mysql_error(&m_sqlCon);  
return FALSE;  

附MySQL的API介面:

mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。  
mysql_close() 關閉一個伺服器連線。  
mysql_connect() 連線一個MySQL伺服器。該函式不推薦;使用mysql_real_connect()代替。  
mysql_change_user() 改變在一個開啟的連線上的使用者和資料庫。  
mysql_create_db() 建立一個數據庫。該函式不推薦;而使用SQL命令CREATE DATABASE。  
mysql_data_seek() 在一個查詢結果集合中搜尋一任意行。  
mysql_debug() 用給定字串做一個DBUG_PUSH。  
mysql_drop_db() 拋棄一個數據庫。該函式不推薦;而使用SQL命令DROP DATABASE。  
mysql_dump_debug_info() 讓伺服器將除錯資訊寫入日誌檔案。  
mysql_eof() 確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。  
mysql_errno() 返回最近被呼叫的MySQL函式的出錯編號。  
mysql_error() 返回最近被呼叫的MySQL函式的出錯訊息。  
mysql_escape_string() 用在SQL語句中的字串的轉義特殊字元。  
mysql_fetch_field() 返回下一個表字段的型別。  
mysql_fetch_field_direct () 返回一個表字段的型別,給出一個欄位編號。  
mysql_fetch_fields() 返回一個所有欄位結構的陣列。  
mysql_fetch_lengths() 返回當前行中所有列的長度。  
mysql_fetch_row() 從結果集合中取得下一行。  
mysql_field_seek() 把列游標放在一個指定的列上。  
mysql_field_count() 返回最近查詢的結果列的數量。  
mysql_field_tell() 返回用於最後一個mysql_fetch_field()的欄位游標的位置。  
mysql_free_result() 釋放一個結果集合使用的記憶體。  
mysql_get_client_info() 返回客戶版本資訊。  
mysql_get_host_info() 返回一個描述連線的字串。  
mysql_get_proto_info() 返回連線使用的協議版本。  
mysql_get_server_info() 返回伺服器版本號。  
mysql_info() 返回關於最近執行得查詢的資訊。  
mysql_init() 獲得或初始化一個MYSQL結構。  
mysql_insert_id() 返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。  
mysql_kill() 殺死一個給定的執行緒。  
mysql_list_dbs() 返回匹配一個簡單的正則表示式的資料庫名。  
mysql_list_fields() 返回匹配一個簡單的正則表示式的列名。  
mysql_list_processes() 返回當前伺服器執行緒的一張表。  
mysql_list_tables() 返回匹配一個簡單的正則表示式的表名。  
mysql_num_fields() 返回一個結果集合重的列的數量。  
mysql_num_rows() 返回一個結果集合中的行的數量。  
mysql_options() 設定對mysql_connect()的連線選項。  
mysql_ping() 檢查對伺服器的連線是否正在工作,必要時重新連線。  
mysql_query() 執行指定為一個空結尾的字串的SQL查詢。  
mysql_real_connect() 連線一個MySQL伺服器。  
mysql_real_query() 執行指定為帶計數的字串的SQL查詢。  
mysql_reload() 告訴伺服器重灌授權表。  
mysql_row_seek() 搜尋在結果集合中的行,使用從mysql_row_tell()返回的值。  
mysql_row_tell() 返回行游標位置。  
mysql_select_db() 連線一個數據庫。  
mysql_shutdown() 關掉資料庫伺服器。  
mysql_stat() 返回作為字串的伺服器狀態。  
mysql_store_result() 檢索一個完整的結果集合給客戶。  
mysql_thread_id() 返回當前執行緒的ID。  
mysql_use_result() 初始化一個一行一行地結果集合的檢索。 
通過本文的介紹,希望你對C++連線mysql資料庫的兩種方法有所瞭解


相關推薦

C++連線mysql資料庫方法(ADO連線mysql api連線)

【原文 http://www.jb51.net/article/44262.htm 】 現在正做一個介面,通過不同的連線字串操作不同的資料庫。要用到mysql資料庫,C++連線mysql有2種方法:利用ADO連線、利用mysql自己的api函式進行連線,下面看看如何用吧。

詳講:C#快速匯出多個sheet到excel的方法(CellRange方法), 解決了(匯入時外部表不是預期的格式)

C# 匯出的表載入時報錯:外部表不是預期的格式。的解決方案 在網絡卡找了一些Excel匯出的方法,大部分能匯出,但時不能將匯出的Excel匯入。總是報:外部表不是預期的格式 找了好久終於找到了解決方案。 這是本人整理修改後的的可以實現匯出匯入的方法。供大家學習參考,方法就是用一個沒問題的

[MongoDB學習筆記-02] Node.js連線MongoDB的方法

MongoDB Node.js驅動程式是被官方所支援的原生Node.js驅動程式,他是至今為止最好的實現, 並且得到了MongoDB官方的支援。MongoDB團隊已經採用MongoDB Node.js驅動程式作為標準方法。 npm install mong

介紹C#解析HTML的方法

在搜尋引擎的開發中,我們需要對網頁的Html內容進行檢索,難免的就需要對Html進行解析。拆分每一個節點並且獲取節點間的內容。此文介紹兩種C#解析Html的方法。     C#解析Html的第一種方法:     用System.Net.WebClient下載Web Page存到本地檔案或者String中,用

Linux安裝MySQL方法 先解除安裝之前版本

執行平臺:CentOS 8.2 x86_64 安裝方法:安裝MySQL主要有兩種方法:一種是通過原始碼自行編譯安裝,這種適合高階使用者定製MySQL的特性,這裡不做說明;另一種是通過編譯過的二進位制檔案進行安裝。二進位制檔案安裝的方法又分為兩種:一種是不針對特定平臺的通用安裝

C++ 拼接字串的方法

#include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <sstream> usin

C++運算子過載的方法

#include<iostream> using namespace std; class Complex { public: Complex(int a=0, int b=0) { this->a = a; this->b = b;

VC++ 呼叫 C#生成DLL的方法

今年在C++呼叫對方用C#寫的DLL時,遇到託管和非託管的問題。      原帖:      以及參考文章: VisualC、Delphi或者VB等程式語言來編寫的DLL檔案,在編譯完成以後,產生DLL檔案已經是一個可以直接供計算機使用的二進位制檔案,而Visua

C++ 將int轉換為string的方法【to_stringsstream】

第一種是to_string函式,C++11新特性,使用非常方便,簡單查了下:c++11標準增加了全域性函式std::to_string,以及std::stoi/stol/stoll等等函式(這幾個就是

php5.3中連線sqlserver2000的方法(com與ODBC)

$conn = new Com("ADODB.Connection"); //例項化一個Connection物件  $connstr = "provider=sqloledb;datasource=.;uid=sa;pwd=123456;database=jnold;";  $conn->Open(

C語言編程 方法打印一個菱形(漸入顯示)

nag 支持 一個 left c語言 stdio.h watermark char () <1>第一種方法,利用字符數組定義一個空格數組和一個符號數組, 然後找到數組中間的元素,操作空格字符從中間開始向兩邊與符號數組的元素互換, 每互換一次進行一次輸出,打印上半

JS區分中英文字元的方法: 正則charCodeAt()方法

JS區分中英文字元的兩種方法: 正則和charCodeAt()方法。 正則無疑是最強大的判斷各種條件的方法, 最近也在研習它, 雖然枯燥, 但仍有樂趣. 用它來判斷一個雙位元組的中文字元也是輕而易舉地. 而判斷中文字元,  簡單且執行效率高. regExpForm.onblur=f

Flask 設定cookie的方法.獲取cookie,刪除cookie的方法(修改過期時間)

設定cookie 方法一: 建立物件   make_response的物件 呼叫物件 的set_cookie方法設定cookie 方法二: 直接設定表單頭 除了鍵值對,其他部分可去瀏覽器檢查摘抄  resp.headers["Set-Cook

vue陣列優化的方法track-bykey 這個有什麼區別

1.  v-bind:key="  " 是vue2.x提出的,1.x的寫法是track-by=" " 2、(1)vue1.x中v-for不能顯示重複資料,要在v-for的元素內定義track-by="$index",即以序號為索引,如此當增加或者刪除資料,view都會跟著改變

JS刪除JSON陣列中的元素的方法:deletesplice

最近的需求中,需要從JSON陣列中刪除元素,之前不太瞭解,特地查了一下,總結一下: splice(startIndex,count);這個方法用於從陣列的第startIndex位開始,刪除count個元素。 說明: 1、滿足條件的元素直接被刪除,腳標重信排 2、sta

遍歷Map的方法:keySet()entrySet()

Map map=new HashMap(); Iterator it=map.keySet().iterator(); Object key; Object value; while(it.hasNext()){ key=it.next(); value=map.get(key); Syste

機器學習方法——監督學習無監督學習(通俗理解)

前言 機器學習分為:監督學習,無監督學習,半監督學習(也可以用hinton所說的強化學習)等。 在這裡,主要理解一下監督學習和無監督學習。 監督學習(supervised learning) 從給定的訓練資料集中學習出一個函式(模型引數),當新的資料到來時,可以根據這個函式

Linux 下操作gpio(方法,驅動mmap)

目前我所知道的在linux下操作GPIO有兩種方法:  1.  編寫驅動,這當然要熟悉linux下驅動的編寫方法和技巧,在驅動裡可以使用ioremap函式獲得GPIO物理基地址指標,然後使用這個指標根據ioctl命令進行GPIO暫存器的讀寫,並把結果回送到應用層。這裡提供

資料獲取的方法:DataListSqlDataReader

資料獲取的兩種方法:一種是DataReader向後讀寫的類,缺點是不夠靈活; 另一種是DataSet資料集,會消耗一些額外的記憶體,但是靈活性高 string strsql = "Data Sour

js的call() ,apply() 方法的區別用法,最白話文的解釋,讓枯燥滾粗!

背景:今天群裡有 妹子(我就不指名道姓嘍)說:百度了一圈calll()函式和apply()函式,感覺還是糊里糊塗然後群裡熱鬧了,各種表情包,各種殷勤,你懂的!正好我前幾天剛又重新翻了一遍 那本 600多