按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
isDesc = FALSE;
}
最后要将各控件和它们对应的变量关联起来,代码如下:
void CAdoTestView::DoDataExchange(CDataExchange* pDX )
·359 ·
…………………………………………………………Page 371……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdoTestView)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
DDX_Control(pDX; IDC_LISTBOX; m_strListBox);
DDX_Control(pDX; IDC_DATAGRID; m_strDataGrid);
DDX_Text(pDX; IDC_CONNECTION_STRING; m_strConnection);
DDX_Text(pDX; IDC_EXECUTE_STRING; m_strSQL);
}
(2 )编写各消息响应函数
前面已经说过,在编写 ADO 的程序时,要用 try 和 catch,否则 ADO 调用错误有可能使
程序崩溃,一定要随时记得捕捉__error 例外以及其他错误。因此首先编写捕获例外时的
处理函数。为类 CAdoTestView 添加 public 成员函数 void GenerateError(HRESULT hr; PWSTR
pwszDescription) ,代码如下:
void CAdoTestView::GenerateError(HRESULT hr; PWSTR pwszDescription )
{
CString m_strError;
m_strError。Format(〃Run…time error ’%d (%x)’〃; hr; hr);
m_strError += 〃nr〃;
m_strError += pwszDescription;
AfxMessageBox(m_strError);
}
接下来为各个按钮添加响应函数。首先为用来设定数据源的按钮添加响应函数:打开
“ClassWizard ”对话框,在“Class name ”下拉菜单中选择 CAdoTestView,在 Object IDs 下
拉列表中选择 IDC_SOURCE ,在“Messages ”下拉列表中选择 BN_CLICKED ,单击“Add
Function ”,采用默认的函数名,然后依次单击“OK ”和“Edit Code ”按钮,定位到函数
CAdoTestView::OnSource(),代码如下:
void CAdoTestView::OnSource()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
HRESULT hr;
IDataSourceLocatorPtr m_dlPrompt = NULL;
_ConnectionPtr m_Conn = NULL;
//初始化
::CoInitialize(NULL);
·360 ·
…………………………………………………………Page 372……………………………………………………………
第 12 章 数据库开发
//创建 IDataSourceLocatorPtr 的实例
hr = m_dlPrompt。CreateInstance(__uuidof(DataLinks));
//弹出数据连接的对话框
m_Conn = m_dlPrompt…》PromptNew();
if (m_Conn!=NULL)
{
//将连接字符串复制到 m_strConnect 中
m_strConnection。Format(〃%s〃; (char*)m_Conn…》ConnectionString);
//将变量中的值保存到控件中
UpdateData(FALSE);
}
}
编写好设置数据源的代码,接下来该为“连接”按钮编写响应函数了。在编写此函数之
前,先要编写数据库表名的函数。因为当连接成功时,在 List Box 控件中会显示出数据库中
所有表的名称。为类 CAdoTestView 添加一个函数 void getTables() ,它是 public 的,用来显
示表名。代码如下:
void CAdoTestView::getTables()
{
_bstr_t tablesNames;
CString kooky;
//先将 List Box 清空
m_ListBox。ResetContent();
//将控件中的值保存到变量中
UpdateData( TRUE);
try
{
//创建实例
m_Recordset。CreateInstance(__uuidof(Recordset));
// 以只读方式打开结果集,得到表名信息
m_Recordset = m_Connection…》OpenSchema (adSchemaTables;vtMissing;vtMissing);
//如果结果集没有结束
while (!m_Recordset…》adoEOF)
{
//得到表项的名字
tablesNames = m_Recordset…》GetCollect(〃TABLE_NAME〃);
kooky = (char*) tablesNames;
//如果是表项,则加到 ListBox 中
if (kooky。Left(4) != 〃MSys〃)
m_ListBox。AddString( kooky );
//移到下一个表项
·361 ·
…………………………………………………………Page 373……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
m_Recordset…》MoveNext();
}
}
//捕获例外__error
catch (__error &e)
{
GenerateError(e。Error(); e。Description());
}
//捕捉其他例外
catch(。。。) {}
//将变量中的值保存到控件中
UpdateData( FALSE );
//最后将结果集置为空
m_Recordset = NULL;
}
现在为“连接”按钮编写响应函数 。具体步骤与为“数据源”按钮添加响应函数的一致,
只是 Object IDs 下拉列表中选择 Connect 按钮的 ID :IDC_CONNECT ,代码如下:
void CAdoTestView::OnConnect()
{
// TODO: Add your control notification handler code here
//更新变量值
UpdateData(TRUE);
try
{
//创建实例
m_Connection。CreateInstance(__uuidof(Connection));
//根据连接字符串开启数据连接
m_Connection…》Open( _bstr_t( m_strConnection。GetBuffer(0) ); 〃〃; 〃〃; …1);
}
//捕获例外__error
catch (__error &e)
{
GenerateError(e。Error(); e。Description());
}
//捕捉其他例外
catch(。。。) {}
//将变量中的值保存到控件中
UpdateData( FALSE );
//显示表项名
getTables();
·362 ·
…………………………………………………………Page 374……………………………………………………………
第 12 章 数据库开发
}
按照顺序,为“操作”按钮编写响应函数。代码如下:
void CAdoTestView::OnExecute()
{
// TODO: Add your control notification handler code here
try
{
//创建实例
m_Recordset。CreateInstance(__uuidof(Recordset));
//将控件中的值保存到变量中,主要是保存 SQL 语句
UpdateData(TRUE);
//设定光标服务
m_Connection…》CursorLocation = adUseClient;
//根据连接字符串开启数据连接,得到结果集
m_Recordset…》Open(m_strSQL。GetBuffer(0); m_Connection。GetInterfacePtr(); adOpenDynamic;
adLockOptimistic; adCmdText);
}
//捕获例外__error
catch (__error &e)
{
GenerateError(e。Error(); e。Description());
}
//捕获其他例外
catch (。。。) {}
//将结果集中的内容在 datagrid 中显示出来
m_DataGrid。SetRefDataSource((LPUNKNOWN)m_Recordset);
//刷新 DataGrid
m_D