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的兩種方法(Cell和Range方法), 解決了(匯入時外部表不是預期的格式)
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_string和sstream】
第一種是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-by和key 這兩個有什麼區別
1. v-bind:key=" " 是vue2.x提出的,1.x的寫法是track-by=" " 2、(1)vue1.x中v-for不能顯示重複資料,要在v-for的元素內定義track-by="$index",即以序號為索引,如此當增加或者刪除資料,view都會跟著改變
JS刪除JSON陣列中的元素的兩種方法:delete和splice
最近的需求中,需要從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暫存器的讀寫,並把結果回送到應用層。這裡提供
資料獲取的兩種方法:DataList和SqlDataReader
資料獲取的兩種方法:一種是DataReader向後讀寫的類,缺點是不夠靈活; 另一種是DataSet資料集,會消耗一些額外的記憶體,但是靈活性高 string strsql = "Data Sour
js的call() ,apply() 兩種方法的區別和用法,最白話文的解釋,讓枯燥滾粗!
背景:今天群裡有 妹子(我就不指名道姓嘍)說:百度了一圈calll()函式和apply()函式,感覺還是糊里糊塗然後群裡熱鬧了,各種表情包,各種殷勤,你懂的!正好我前幾天剛又重新翻了一遍 那本 600多