ODBC連接MySQL(IDE:codeblocks)
1. ODBC概述
ODBC(Open Database Connectivity),開放數據庫互連。它爲編寫關係數據庫的客戶軟件提供了一種統一的接口。ODBC 提供一個標準的 API,可用於處理不同數據庫的客戶應用程序。使用ODBC API 的應用程序可以與任何具有ODBC驅動程序的關係數據庫進行通信。ODBC 是爲客戶應用程序訪問關係數據庫時提供的一個標準的接口,對於不同的數據庫,ODBC 提供了統一的 API,使用該 API 來訪問任何提供了 ODBC 驅動程序的數據庫。客戶程序,ODBC接口,數據庫驅動程序和數據庫關係如下:
2. 配置ODBC數據源
我使用C++語言來連接MySQL數據庫,IDE爲codeblocks,操作系統windows7(windows10也是一樣的)。連接數據庫前需要先配置ODBC數據源。
1)安裝MySQL的ODBC驅動程序
驅動程序下載地址https://dev.mysql.com/downloads/connector/odbc/
如果沒有安裝VS的話,要下載老版本的32位驅動(新版本需要VS的支持),如下圖。接下來只需要安裝即可(完全安裝)。
2)添加ODBC數據源
首先打開ODBC數據源管理器,有兩種打開方法
a. 控制面板下打開ODBC
b. 打開文件:C:\Windows\SysWOW64\odbcad32.exe
建議使用第二種方式,第一種方式打開可能無法檢測到之前安裝的驅動程序。打開後如下所示:
點擊添加,選擇MySQL ODBC驅動程序。
然後填寫如下信息,用戶名和密碼填寫數據庫的登錄名和密碼,數據源名自己自己隨意起,TCP/IP Server可以不用填或者填localhost,這裏只是連接本地的數據庫;點擊Details設置編碼格式爲GBK,這樣可以正常顯示中文;Database中會自動檢測已有的數據庫,不過需要先開啓MySQL服務(net start mysql),選擇你想要連接的數據庫。點擊完成。
名爲test1的ODBC數據源創建成功,點擊配置可修改配置。
3. Codeblocks IDE執行環境配置
codeblocks需要鏈接如下的dll文件纔可以編譯通過ODBC編程的各種函數。確保電腦裏存在這個文件,否則網上下載。
至此C++通過ODBC連接數據庫的所有的環境配置就完成了。接下來就是編碼連接數據庫。
4. 示例程序
1.ODBC連接數據庫流程
分配環境句柄→分配連接句柄→連接數據源→分配語句句柄→執行SQL語句→釋放語句句柄→斷開數據源的連接→釋放連接句柄→釋放環境句柄。
2. 實例程序說明
#include<windows.h>
#include<iostream>
#include <assert.h>
#include<sql.h>
#include <sqlext.h>
using namespace std;
main(){
SQLHENV serverhenv;
SQLHDBC serverhdbc;
SQLHSTMT serverhstmt;
SQLRETURN ret;
SQLCHAR sno[20]={0},sex[20]={0},sname[20]={0},dept[20]={0},classno[20]={0},bdate[30]={0},cno[20]={0},cname[20]={0},semester[10]={10};
SQLINTEGER grade=0,length;
//分配環境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);
//設置環境屬性
ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocEnvHandle error!"<<endl;
system("pause");
}
//分配連接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocDbcHandle error!"<<endl;
system("pause");
}
//數據庫連接
ret = SQLConnect(serverhdbc,(SQLCHAR*)"test1",SQL_NTS,(SQLCHAR*)"數據庫用戶名",SQL_NTS,(SQLCHAR*)"數據庫密碼",SQL_NTS);//第二個參數是之前配置的數據源,後面是數據庫用戶名和密碼
if(!SQL_SUCCEEDED(ret))
{
cout<<"SQL_Connect error!"<<endl;
system("pause");\
}
//分配執行語句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);
//執行SQL語句
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"insert into course values('C00','數據結構',00,5,'春');",SQL_NTS);
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"select cno,cname,semester from course",SQL_NTS);
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){
//綁定數據
SQLBindCol(serverhstmt,1, SQL_C_CHAR, (void*)cno,sizeof(cno), &length);
SQLBindCol(serverhstmt,2, SQL_C_CHAR, (void*)cname,sizeof(cname), &length);
SQLBindCol(serverhstmt,3, SQL_C_CHAR, (void*)semester,sizeof(semester), &length);
//將光標移動到下行,即獲得下行數據
while(SQL_NO_DATA != SQLFetch(serverhstmt))
{
cout<<"cno:"<<cno<<" cname:"<<cname<<" semester:"<<semester;
cout<<endl;
}
}
//釋放語句句柄
ret=SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
cout<<"free hstmt error!"<<endl;
//斷開數據庫連接
ret=SQLDisconnect(serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"disconnected error!"<<endl;
//釋放連接句柄
ret=SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free hdbc error!"<<endl;
//釋放環境句柄句柄
ret=SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free henv error!"<<endl;
system("pause");
}
程序執行前的course表格
程序執行後添加了“數據結構這門課”
查看數據庫發現確實用C++實現了對數據庫的操作