ODBC連接MySQL

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數據庫,IDEcodeblocks,操作系統windows7windows10也是一樣的)。連接數據庫前需要先配置ODBC數據源。

1)安裝MySQLODBC驅動程序

驅動程序下載地址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),選擇你想要連接的數據庫。點擊完成。

 

名爲test1ODBC數據源創建成功,點擊配置可修改配置。

 

 

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++實現了對數據庫的操作

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章