添加ADO类,项目->添加类(添加是C++类,不是基于MFC类),名字叫ADOConn; 在stdafx.h中添加: #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 在ADOConn.h文件中添加变量 _RecordsetPtr ? ?m_pRecordset; ? //记录集指针 _ConnectionPtr ?m_pConn; //连接数据库指针 在ADOConn.cpp 创建数据库初始化方法: void ADOConn::OnInitADOConn(void)

{

//初始化OLE/COM环境

::CoInitialize(NULL);

try

{

//创建connection对象

m_pConn.CreateInstance("ADODB.Connection");

//设置连接字符串

m_pConn->ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=res/GiftSoft.accdb";

//Server uid pwd 的设置,根据实际情况来

m_pConn->Open("","","",adConnectUnspecified);

}

catch(_com_error e)

{

//显示错误信息

AfxMessageBox(e.Description());

}

}创建断开数据库方法:void ADOConn::ExitConnect(void)

{

if(m_pRecoderSet!=NULL)

{

m_pRecoderSet->Close();

}

m_pConn->Close();

//释放环境

::CoUninitialize();

}创建执行SQL语句的方法: bool ADOConn::ExceuteSQL(_bstr_t bstrSQL)

{

try

{

//是否连接数据库

if(m_pConn==NULL)

OnInitADOConn();

m_pConn->Execute(bstrSQL,NULL,adCmdText);

return TRUE;

}

catch(_com_error e)

{

e.Description();

return FALSE;

}

} 创建获取记录集指针的方法: _RecordsetPtr ADOConn::GetRecordSet(_bstr_t bstrSQL)

{

try

{

if(m_pConn==NULL)

OnInitADOConn();

m_pRecoderSet.CreateInstance(__uuidof(Recordset));

m_pRecoderSet->Open(bstrSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch(_com_error e)

{

e.Description();

}

return m_pRecoderSet;

}创建ADOConn类的实例 ADOConn m_AdoConn并初始化: m_AdoConn.OnInitADOConn();

CString sql;

//获取记录集指针其中tb_event为表名称

sql.Format(_T("select * from tb_event"));

m_AdoConn.m_pRecoderSet=m_AdoConn.GetRecordSet((_bstr_t)sql);

m_AdoConn.m_pRecoderSet->MoveFirst();

m_PageSize=m_AdoConn.m_pRecoderSet->PageSize; //每个记录中包含的记录条数

m_PageCount=m_AdoConn.m_pRecoderSet->PageCount;//记录页个数

m_AbsolutePage=m_AdoConn.m_pRecoderSet->AbsolutePage; //当前记录绝对位置的序号

第一步:首先建立基于对话框的MFC应用程序Library,然后添加一个用户登录界面如图:

并建立此对话框的类LoginDlg ,在类中新建两个变量CString m_strName; ?CString m_strPassword;并完善相应的构造函数和DoDataExchange 部分代码如下:

LoginDlg::LoginDlg(CWnd* pParent /*=NULL*/) : CDialog(LoginDlg::IDD, pParent) { m_strName=_T(""); m_strPassword=_T(""); }

void LoginDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX,IDC_LOGIN_NAME,m_strName); DDV_MaxChars(pDX,m_strName,8); DDX_Text(pDX,IDC_LOGIN_PASSWORD,m_strPassword); DDV_MaxChars(pDX,m_strPassword,8); }

编译运行程序,能够正常运行出现界面

第二步:用ADO方法连接名为Library.mdb的数据库

1、在stdafx.h中添加#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")

注意:在#include语句后面,不要加到最前面

2、在主对话框LibraryDlg.h中添加变量_ConnectionPtr pConn; ?用来连接数据库的对象

? ? ? 在LibraryDlg.cpp的构造函数中添加如下代码:

CLibraryDlg::CLibraryDlg(CWnd* pParent /*=NULL*/) : CDialog(CLibraryDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); CoInitialize(NULL); pConn = _ConnectionPtr(__uuidof(Connection)); pConn->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/Library.mdb"; pConn->Open("","","",adConnectUnspecified); }

并在析构函数中pConn->Close();pConn.Release();

此代码主要是用来与数据库建立连接,从主对话框运行开始就建立连接,直到程序结束。

注意:Provider的获取:在VS2010工具菜单->连接到数据库,在添加连接对话框中浏览到你之前建好的数据库,并点测试。

?如果数据库连接成功,点高级属性,Provider就在对话框的最下面,copy过来就行了。

第三步:在登录框获取数据库中的记录,并与输入的用户名和密码进行对比,以保证正常登录

在LoginDlg.cpp的登录按钮中添加如下代码:

void LoginDlg::OnBnClickedConfirm() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); ? ? CoInitialize(NULL); /*CString mSqlStr; mSqlStr="select * from CLERK where NAME='"; mSqlStr+=m_strName; mSqlStr+="'"; */ if (m_strName.IsEmpty()) ? ?/*判断用户名信息是否为空*/ { AfxMessageBox(_T("请输入用户名!")); return; } _RecordsetPtr pRst(__uuidof(Recordset)); pRst = ((CLibraryDlg*)(AfxGetMainWnd()))->pConn->Execute("select * from CLERK ",NULL,adCmdText); if(pRst->rsEOF) { MessageBox(_T("用户名不存在,请重新输入")); } else if ((CString)pRst->GetCollect("PASSWORD")==m_strPassword) { CDialog::OnOK(); } else { MessageBox(_T("密码不正确")); } pRst->Close(); pRst.Release(); CoUninitialize(); }

编译运行就可看到结果了

下一步准备将数据库换成mysql.......

这几天老师让我做一个实现从VS2010中向Access数据库读写数据的程序。我想起当初学习VS的时候做过一个类似的密码管理器,就是利用数据库的一些知识。当时也是突发奇想,找了各种资料,总算有了个结果,勉强能用,但是脑袋却是一片迷茫。现在恰好有个机会重新做一遍,把思路好好地捋一捋,填填当初没埋上的坑。

基本思路

数据库系统的原理性知识先放一放,这里主要讲一下实现一个数据库程序时的实际操作。 数据库应用系统的设计步骤: 1. 数据库设计 2. 配置数据源 3. 编写数据库应用程序

具体步骤

1.数据库设计

既然是对数据库进行操作,那么首先要有一个数据库。 至于如何创建一个Access数据库,可以网上搜一下。大概就是使用Microsoft Access2013打开软件,建立空白桌面数据库, 开始,视图,定义表,填写表。

2.配置ODBC数据源

(1)开始->设置->在搜索框中输入“ODBC”->选择对应的系统版本, 弹出: (2)选择系统DSN,并点击右边的添加按钮,选择对应的驱动程序: (3)点击完成,进行数据源和数据库的配置: 数据源名随便取,数据库选择所要用到的数据库的路径。 (4)点击确定,可以看到数据源已经添加到系统DSN的列表中了。

3.编写数据库应用程序

终于可以打开VS敲代码了。 首先,当然是新建一个对话框工程,关于对话框界面的设计之类的操作就不再细表。这里主要介绍数据库相关的操作。

导入ado.dll动态链接库

因为使用到了ado,所以先要进行ado的导入。 在stdafx.h头文件中的最后一条include语句的下方(位置好像有讲究)加入:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\

rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库

同时还要进行COM的初始化,虽然我不知道这是啥。

封装一个ADO类

由于COM的初始化和连接与关闭数据库的一些基本操作会多次用到而且看上去有点吓人,所以我索性把它们封装成了一个ADO类。 这个类的声明:

class ADO

{

public:

_ConnectionPtr m_pConnection; //连接对象指针

_RecordsetPtr m_pRecordset; //记录集对象指针

public:

ADO();

virtual ~ADO();

void OnInitADOConn(); //连接数据库

_RecordsetPtr& OpenRecordset(CString sql); //打开记录集

void CloseRecordset(); //关闭记录集

void CloseConn(); //关闭数据库连接

UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数

};

比如其中的连接数据库的函数的定义是这样的:

void ADO::OnInitADOConn()

{

::CoInitialize(NULL);//COM的初始化

try

{

m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例

_bstr_t strConnect="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Test01.accdb;";//连接字符串

m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库

}

catch(_com_error e)

{

AfxMessageBox(e.Description()); //弹出错误处理

}

}

使用ADO类操作数据库

封装之后,就可以方便地使用ADO来操作数据库了。 读取:

//从数据库中读取一个表,并显示在一个列表控件中

void CTestDlg::AddToGrid(void)

{

ADO m_Ado;

m_Ado.OnInitADOConn();//连接数据库

CString SQL = "select * from table1 order by 学号 desc"; //设置查询字符串

m_Ado.m_pRecordset = m_Ado.OpenRecordset(SQL);//打开记录集

while(!m_Ado.m_pRecordset->adoEOF)

{

m_list.InsertItem(0,"");

m_list.SetItemText(0,0,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("学号"));

m_list.SetItemText(0,1,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("姓名"));

m_list.SetItemText(0,2,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("成绩"));

m_Ado.m_pRecordset->MoveNext();//将记录集指针移动到下一条记录

}

m_Ado.CloseRecordset();

m_Ado.CloseConn();//断开数据库连接

}

添加:

//“添加”按钮的消息响应函数,添加一条记录到数据库

void CTestDlg::OnBnClickedAdd()

{

UpdateData(TRUE); //把编辑框中的数据传给相应的变量

if(m_numb.IsEmpty() || m_name.IsEmpty() || m_grad.IsEmpty())

{

MessageBox("基础信息不能为空!");

return;

}

ADO m_Ado; //定义一个ADO对象

m_Ado.OnInitADOConn(); //连接数据库

CString sql = "select * from table1"; //查询语句

m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql); //打开记录集

try

{

m_Ado.m_pRecordset->AddNew(); //添加新行

m_Ado.m_pRecordset->PutCollect("学号",(_bstr_t)m_numb);

m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);

m_Ado.m_pRecordset->PutCollect("成绩",(_bstr_t)m_grad);

m_Ado.m_pRecordset->Update(); //更新数据表记录

m_Ado.CloseRecordset(); //关闭数据集

m_Ado.CloseConn(); //关闭数据库连接

}

catch(...)

{

MessageBox("操作失败");

return;

}

MessageBox("添加成功");

m_list.DeleteAllItems(); //删除列表控件

AddToGrid(); //从数据库中将数据载入表格

}

基本操作就是以上,接下来解决一下期间遇到的问题。

开始填坑

1.什么是数据源?为什么要弄这么个东西?不弄行不行?

先看看百度百科怎么说: 数据源是指数据库应用程序所使用的数据库或者数据库服务器。 数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体。在数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接。

应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。

2. 连接字符串的问题

老版本的:

_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\

uid=;pwd=;DBQ=SecretData1.mdb;";

新版本的:

_bstr_t strConnect="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Test01.accdb;";

m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库

可能会出现错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。 解决办法: 去http://www.sxzhongrui.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载。然后安装就行了。

3. 数据库文件的路径问题,在其他电脑上还能运行吗?

发现必须在项目路径和Debug文件夹路径中各自放一份数据库文件才能运行。不知道为啥。 http://www.sxzhongrui.com/topics/390096371