VC++学习笔记(8)——在Visual C++中使用ADO(结)

 

前面两篇写了那么多,如果不实际应用很难理解,要灵活应用就更不容易了。

现在根据我的具体经验简单总结一下,虽然不是很深入,但是很实用~

如果想让一个对话框能够连接数据库,首先在该对话框头文件中添加以下代码:

#include "resource.h"
// CG : In order to use this code against a different version of ADO, the appropriate
// ADO library needs to be used in the #import statement
#import "C:/Program Files/Common Files/system/ado/msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"
#include <afxtempl.h>

然后为对话框类增加保护成员:

protected:
 HICON m_hIcon;

 void GenerateError(HRESULT hr, PWSTR pwszDescription);

 _RecordsetPtr m_pRs;
 CString m_strConnection;
 CString m_strCmdText;

如果要使数据绑定控件,应在对话框类定义之前按照如下方式定义CCustomRs类:

class CCustomRs :
 public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
 ADO_VARIABLE_LENGTH_ENTRY2(1, adVarWChar, m_wszid, sizeof(m_wszid), lidStatus, FALSE)
 ADO_VARIABLE_LENGTH_ENTRY2(2, adVarWChar, m_wszname, sizeof(m_wszname), lnameStatus, FALSE)
 ADO_FIXED_LENGTH_ENTRY(3, adSmallInt, m_sage, lageStatus, FALSE)
 ADO_VARIABLE_LENGTH_ENTRY2(4, adVarWChar, m_wszsex, sizeof(m_wszsex), lsexStatus, FALSE)
 ADO_VARIABLE_LENGTH_ENTRY2(5, adVarWChar, m_wszemail, sizeof(m_wszemail), lemailStatus, FALSE)
END_ADO_BINDING()

protected:
 WCHAR m_wszid[9];
 ULONG lidStatus;
 WCHAR m_wszname[256];
 ULONG lnameStatus;
 SHORT m_sage;
 ULONG lageStatus;
 WCHAR m_wszsex[256];
 ULONG lsexStatus;
 WCHAR m_wszemail[256];
 ULONG lemailStatus;
};

其中的控件绑定和成员变量依具体情况不同而改变。然后使对话框类继承CCustomRs。

这样头文件中的所有工作就完成了~

接下来是源文件。

首先要在对话框类的构造函数中添加初始化代码:

 m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb;Persist Security Info=False");
m_strCmdText = _T("*");
 
 m_pRs = NULL;

以上是连接Access数据库,*.mdb是具体的数据库名,该数据库须在工程目录下,否则须提供具体路径。若连接SQL Server则连接字串为"Provider=SQLOLEDB.1;uid=sa;pwd=123;Initial Catalog=StudentInfo;Data Source=(local)"

同时还须手动为对话框类添加析构函数:

CADODlg::~CADODlg()
{
 m_pRs = NULL;
}

注意:不要忘了在头文件中进行声明!

然后找到OnInitDialog()成员函数,添加代码如下:

BOOL CADODlg::OnInitDialog()
{
 HRESULT hr = NOERROR;
 IADORecordBinding *piAdoRecordBinding = NULL;

 CDialog::OnInitDialog();

 try
 {
  m_pRs.CreateInstance(__uuidof(Recordset));
  m_pRs->CursorLocation = adUseClient;
  m_pRs->Open((LPCTSTR)m_strCmdText,
   (LPCTSTR)m_strConnection, adOpenStatic,
   adLockOptimistic, adCmdTableDirect);
  
  if (FAILED(hr = m_pRs->QueryInterface(__uuidof(IADORecordBinding), (LPVOID *)&piAdoRecordBinding)))
   _com_issue_error(hr);
 }
 catch (_com_error &e)
 {
  GenerateError(e.Error(), e.Description());
 }

……

}

接下来就是GenerateError()的实现代码:

void CADODlg::GenerateError(HRESULT hr, PWSTR pwszDescription)
{
 CString strError;
 
 strError.Format("Run-time error '%d (%x)'", hr, hr);
 strError += "/n/n";
 strError += pwszDescription;
 
 AfxMessageBox(strError);
}

到此,连接数据库的所有准备工作就进行完毕了,之后就可以对数据库进行所需要的操作了~酷

 

PS:今天遇到了一个错误“'operator =' is ambiguous”,感觉这个错误很面熟,好像以前学习C语言的时候遇到过~的确这时一个很常见的错误,出错的主要原因就是运算符左右两侧的数据类型不一致,进行数据类型转换以后就可以解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值