前面两篇写了那么多,如果不实际应用很难理解,要灵活应用就更不容易了。
现在根据我的具体经验简单总结一下,虽然不是很深入,但是很实用~
如果想让一个对话框能够连接数据库,首先在该对话框头文件中添加以下代码:
#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语言的时候遇到过~的确这时一个很常见的错误,出错的主要原因就是运算符左右两侧的数据类型不一致,进行数据类型转换以后就可以解决了。