首页 > 代码库 > C++操作mysql方法总结(2)

C++操作mysql方法总结(2)

C++通过ODBC和通过MFC ODBC操作mysql的两种方式

 

使用vs2013和64位的msql 5.6.16进行操作

 

项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍

 

 

既然使用到了ODBC那么就要需要添加数据源了

控制面板->管理工具->数据源->用户DSN->添加

image

填写相关的数据库连接配置和使用的数据库,可点击Test进行测试,查看是否成功连接,设置完成后点击OK

其中Data Source Name即MySqlODBC我们会在连接数据库时用到

image

至此,数据源添加完毕

 

一、通过ODBC进行操作

开放数据库互连(Open Database Connectivity,ODBC)是微软提供的一组用于数据库访问的规范接口,多数数据库都提供了ODBC驱动

1、新建一个空项目

 

2、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

至此,相关配置全部完成

 

程序代码

main.cpp

 

#include <Windows.h>#include <iostream>#include <iomanip>#include <sql.h>#include <odbcss.h>#include <sqlext.h>#define MAXBUFLEN   255 #define MaxNameLen  20#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")SQLHENV  henv = SQL_NULL_HENV;//定义环境句柄SQLHDBC  hdbc1 = SQL_NULL_HDBC;//定义数据库连接句柄     SQLHSTMT  hstmt1 = SQL_NULL_HSTMT;//定义语句句柄using namespace std;int main(){    RETCODE retcode;//错误返回码    retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);    if (retcode < 0)//错误处理    {        cout << "allocate ODBC Environment handle errors." << endl;        return -1;    }    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,        (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);    if (retcode < 0) //错误处理    {        cout << "the  ODBC is not version3.0 " << endl;        return -1;    }    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);    if (retcode < 0) //错误处理    {        cout << "allocate ODBC connection handle errors." << endl;        return -1;    }    char* szDSN = "MySqlODBC";//添加数据源时,为其起的名字    char* szUID = "root";    char* szAuthStr = "123456";    retcode = SQLConnect(hdbc1,                        (SQLCHAR*)szDSN,                         (SWORD)strlen(szDSN),                         (SQLCHAR*)szUID,                         (SWORD)strlen(szUID),                         (SQLCHAR*)                        szAuthStr,                        (SWORD)strlen(szAuthStr));    if (retcode < 0) //错误处理    {        cout << "connect to  ODBC datasource errors." << endl;        return -1;    }    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);    if (retcode < 0)     {        cout << "allocate ODBC statement handle errors." << endl;        return -1;    }    retcode = SQLExecDirect(hstmt1, (SQLCHAR*)"SElECT *  FROM book", SQL_NTS);    if (retcode < 0)    {        cout << "Executing statement  throught ODBC  errors." << endl;        return -1;    }    SQLCHAR      bookname[MaxNameLen + 1];    SQLCHAR         size[MaxNameLen + 1];    SQLLEN         columnLen = 0;    retcode = SQLBindCol(hstmt1, 2, SQL_C_CHAR, bookname, MaxNameLen, &columnLen);    retcode = SQLBindCol(hstmt1, 3, SQL_C_CHAR, size, MaxNameLen, &columnLen);    while ((retcode = SQLFetch(hstmt1)) != SQL_NO_DATA)    {        cout <<setw(9) <<"BookName:" << bookname << endl;        cout << setw(9) << "Size:" << size << endl;    }    system("pause");}

 

运行结果

image

 

 

一、通过MFC ODBC进行操作

MFC提供了对ODBC进行了封装,使得利用MFC创建ODBC的应用程序变得简单

1、新建一个win32的控制台应用程序

 

2、进行以下修改

MFC的使用:在共享DLL中使用MFC

字符集:使用Unicode字符集

image

 

3、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

至此,相关配置全部完成

 

程序代码

main.cpp

#include "stdafx.h"#include "afxdb.h"#include <iostream>#include <iomanip>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    CDatabase db;    if (!db.IsOpen())//判断数据库是否已经被打开    {        BOOL bflag=     db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=MySqlODBC;UID=root;PWD=123456"));            if (!bflag)        {            cout << "ERROR" << endl;        }    }    CRecordset rs(&db);    CString str;    str.Format(L"select * from book");    try    {        rs.Open(CRecordset::forwardOnly, (L"%s", str));        short nFields = rs.GetODBCFieldCount();        while (!rs.IsEOF())        {            CDBVariant varValue;            rs.GetFieldValue(L"bookname", varValue);            cout << setw(9) << "BookName:" << *varValue.m_pstringA << endl;            rs.GetFieldValue(L"size", varValue);            cout << setw(9) << "Size:" << *varValue.m_pstringA << endl;            rs.MoveNext();        }    }    catch (...)    {        cout << "ERRPR" << endl;    }    db.Close();    system("pause");}

 

运行结果

image