C++操作mysql方法总结(2)
C++操作mysql方法总结(2)
C++通过ODBC和通过MFC ODBC操作mysql的两种方式
使用vs2013和64位的msql 5.6.16进行操作
项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍
既然使用到了ODBC那么就要需要添加数据源了
控制面板->管理工具->数据源->用户DSN->添加
填写相关的数据库连接配置和使用的数据库,可点击Test进行测试,查看是否成功连接,设置完成后点击OK
其中Data Source Name即MySqlODBC我们会在连接数据库时用到
至此,数据源添加完毕
一、通过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");
}
运行结果
一、通过MFC ODBC进行操作
MFC提供了对ODBC进行了封装,使得利用MFC创建ODBC的应用程序变得简单
1、新建一个win32的控制台应用程序
2、进行以下修改
MFC的使用:在共享DLL中使用MFC
字符集:使用Unicode字符集
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");
}
运行结果
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。