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++实现了对数据库的操作

 


猜你喜欢

转载自blog.csdn.net/buptlihang/article/details/80275641
今日推荐