热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

VC++6.0通过ADO方式连接SQLServer2005

属性名类型是否为主键允许空备注snochar(8)是学号snamevarchar(10)否√姓名ageint否√年龄deptchar(4)否√所在系号commentvarchar(8)否√评语基于ADO方式的实验步骤此例中所用数据库与上例中相同;此例中无需创建数据源。

属性名 类型 是否为主键 允许空 备注 sno char(8) 是 学号 sname varchar(10) 否 √ 姓名 age int 否 √ 年龄 dept char(4) 否 √ 所在系号 comment varchar(8) 否 √ 评语 基于 ADO 方式的实验步骤 此例中所用数据库与上例中相同; 此例中无需创建数据源。

属性名

类型

是否为主键

允许空

备注

sno

char(8)

学号

sname

varchar(10)

姓名

age

int

年龄

dept

char(4)

所在系号

comment

varchar(8)

评语

基于ADO方式的实验步骤

此例中所用数据库与上例中相同;

此例中无需创建数据源。

1)创建VC应用程序

打开VC++6.0,新建工程。选择MFC AppWizardexe),工程名为exec2,存放在D盘实验文件夹里。点击“确定”,在弹出的窗口中选择“基本对话框”,以后的步骤没有需要修改的地方,可以直接点击“完成。”这样一个基于基本对话框的工程就创建好了。

2)界面设计

在工作区左边的树型结构中,选择ResourceView,展开Dialog节点,双击IDD_EXEC2_DIALOG,打开该对话框。在这里添加所需控件。如图17所示。

17

为编辑框和列表框添加变量。在界面右键单击,选择“建立类向导”,弹出如图18所示窗口。

18

本例中需要为编辑框IDC_AGE, IDC_COMMENT, IDC_DEPT, IDC_NAME, IDC_SNO,列表框IDC_LIST添加变量。以IDC_AGE为例,点击“ADD Variable”弹出如图19所示窗口。

19

这里变量名为m_age,类型可从下拉框里选。添加变量完成之后类向导如图20所示。

20

为按钮添加函数,双击按钮可为其添加函数,在exec2Dig.cpp文件里。

3)与ADO相关的代码设计

引入ADO库文件,使用ADO前必须在工程的StdAfx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

//加入ADO支持库

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")

//namespace是命名空间,这里不需要命名空间,主要是为了访问方便,在程序中可以直接访问ADO提供的ConnectionCommandRecordset这三个COM接口

定义ADO连接、命令、记录集变量指针,在exec2Dlg.h文件的class CExec2Dlg : public CDialog方法中添加如下代码:

// 定义ADO连接、命令、记录集变量指针

_ConnectionPtr m_pConnection;

_CommandPtr m_pCommand;

_RecordsetPtr m_pRecordset;

// 该指针为整个应用程序共享,所以放在public下面。

初始化OLE/COM库环境。必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的OnInitDialog()成员函数里初始化OLE/COM库环境。

在本例中,在exec2.cpp文件的BOOL CExec2Dlg::OnInitDialog()成员函数里添加如下代码:

//初始化COM,创建ADO连接等操作

AfxOleInit();

m_pConnection.CreateInstance(__uuidof(Connection));

//ADO操作中建议语句中要常用try...catch()来捕获错误信息,

//因为它有时会经常出现一些想不到的错误

try

{

//打开本地Sql Serverstudent

m_pConnection->Open("driver={SQL Server};Server=XP-201203132217\\SQLSERVER2005;Database=Student;UID=sa;PWD=yuzhongchun","","",adModeUnknown);

//Server后是服务器的计算机名,注意XP-201203132217\\SQLSERVER2005是双斜线啊,写错了就会返回 [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝

//Database后是数据库名

// UID="";PWD=""写入相应的用户名和密码,这里使用的是SQL server验证

}

catch(_com_error e)

{

AfxMessageBox("数据库连接失败!");

return FALSE;

}

exec2Dlg.cpp文件中添加代码。

在#endif下面添加如下代码:

extern CExec2App theApp; // 在此引用应用类中的theApp来获取库连接指针

在BOOL CExec2Dlg::OnInitDialog()函数中添加如下代码:

// TODO: Add extra initialization here

//使用ADO创建数据库记录集

m_pRecordset.CreateInstance(__uuidof(Recordset));

// ADO操作中建议语句中要常用try...catch()来捕获错误信息,

// 因为它有时会经常出现一些想不到的错误

try

{

m_pRecordset->Open("SELECT * FROM s", // 查询s表中所有字段

m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针

adOpenDynamic,

adLockOptimistic,

adCmdText);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

至此,与ADO相关的代码都已添加完了。下面在exec2Dlg.cpp文件中添加应用代码。

4)与功能相关的代码设计

在界面上用到列表框,当鼠标点击列表框的某一行时,其中的数据能够在编辑框中显示出来,这要用到列表框的一个函数。添加此函数的方法如下:摁住Ctrlw键,进入类向导,如图21所示。

21

选择IDC_LIST,在右边的Messages下面选择LBN_SELCHANGE,然后点击“Add Function”按钮,最后点击“确定”按钮,即为列表框添加了此函数。具体代码如下:

//名称:OnSelchangeList

//功能:当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来

void CExec2Dlg::OnSelchangeList()

{

int curSel = m_list.GetCurSel();

_variant_t var,varIndex;

if(curSel <0)

return;

try

{

// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针

m_pRecordset->MoveFirst();

m_pRecordset->Move(long(curSel));

var = m_pRecordset->GetCollect("sname");

if(var.vt != VT_NULL)

m_sname = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("age");

if(var.vt != VT_NULL)

m_age=(LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("sno");

if(var.vt != VT_NULL)

m_sno = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("dept");

if(var.vt != VT_NULL)

m_dept = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("comment");

if(var.vt != VT_NULL)

m_comment = (LPCSTR)_bstr_t(var);

UpdateData(false);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

}

将数据库中的数据显示在列表框中,添加函数ListData()。添加的方法是,在工作区左边的树型结构中,选择ClassView,右键单击CExec2Dlg,在弹出的菜单中选择Add Member Function,出现如图22所示的窗口,类型为void,函数描述为ListData()

22

此函数的具体代码如下:

//名称:ListData

//功能:将数据库中的数据显示在列表框中

void CExec2Dlg::ListData()

{

_variant_t var;

CString strname,strage,strsno,strdept,strcom;

//清空列表框

m_list.ResetContent();

strname=strage=strsno=strdept=strcom="";

//ADO操作中建议语句中要常用try...catch()来捕获错误信息,

//因为它有时会经常出现一些想不到的错误。

try

{

if(!m_pRecordset->BOF)

m_pRecordset->MoveFirst();

else

{

AfxMessageBox("表内数据为空");

return;

}

// 读入库中各字段并加入列表框中

while(!m_pRecordset->adoEOF)

{

var = m_pRecordset->GetCollect("sno");

if(var.vt != VT_NULL)

strsno = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("sname");

if(var.vt != VT_NULL)

strname = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("age");

if(var.vt != VT_NULL)

strage = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("dept");

if(var.vt != VT_NULL)

strdept = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("comment");

if(var.vt != VT_NULL)

strcom = (LPCSTR)_bstr_t(var);

m_list.AddString( strsno &#43; " --> " &#43;strname &#43; " --> "&#43;strage&#43; " --> "&#43; strdept&#43; " --> "&#43; strcom);

m_pRecordset->MoveNext();

}

// 默认列表指向第一项,同时移动记录指针并显示

m_list.SetCurSel(0);

OnSelchangeList();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

}

插入按钮对应的函数代码如下:

//名称:OnWritedata

//功能:将编辑框中输入的学生信息插入到s表中

void CExec2Dlg::OnWritedata()

{

UpdateData();

if(m_sname == "" || m_sno == "")

{

AfxMessageBox("学号和姓名信息不能为空!");

return;

}

//ADO操作中建议语句中要常用try...catch()来捕获错误信息,

//因为它有时会经常出现一些想不到的错误。

try

{

// 写入各字段&#20540;

m_pRecordset->AddNew();

m_pRecordset->PutCollect("sno", _variant_t(m_sno));

m_pRecordset->PutCollect("sname", _variant_t(m_sname));

m_pRecordset->PutCollect("age", atol(m_age));

m_pRecordset->PutCollect("dept", _variant_t(m_dept));

m_pRecordset->PutCollect("comment", _variant_t(m_comment));

m_pRecordset->Update();

AfxMessageBox("插入成功!");

// 更新显示其库内容

int nCurSel = m_list.GetCurSel();

ListData();

m_list.SetCurSel(nCurSel);

// 移动记录指针到新的位置

OnSelchangeList();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

}

修改按钮对应的函数代码如下:

//名称:OnModify

//功能:修改学生信息

void CExec2Dlg::OnModify()

{

UpdateData(); // 更新对话框数据

if(m_list.GetCount() == 0)

{

AfxMessageBox("表中记录数为空!");

return;

}

else if(m_list.GetCurSel() <0 || m_list.GetCurSel() > m_list.GetCount())

m_list.SetCurSel(0);

// 修改当前记录的字段&#20540;

try

{

m_pRecordset->PutCollect("sno", _variant_t(m_sno));

m_pRecordset->PutCollect("sname", _variant_t(m_sname));

m_pRecordset->PutCollect("age", atol(m_age));

m_pRecordset->PutCollect("dept", _variant_t(m_dept));

m_pRecordset->PutCollect("comment", _variant_t(m_comment));

m_pRecordset->Update();

// 重新读入库记录更新显示

int nCurSel = m_list.GetCurSel();

ListData();

m_list.SetCurSel(nCurSel);

// 移动记录指针到新的位置

OnSelchangeList();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

}

删除按钮对应的函数代码如下:

//名称:OnDelete

//功能:删除选中的学生信息

void CExec2Dlg::OnDelete()

{

if(m_list.GetCount() == 0)

return;

else if(m_list.GetCurSel() <0 || m_list.GetCurSel() > m_list.GetCount())

m_list.SetCurSel(0);

try

{

// 删除当前行记录

m_pRecordset->Delete(adAffectCurrent);

m_pRecordset->Update();

// 删除列表中当前&#20540;

int nCurSel = m_list.GetCurSel();

m_list.DeleteString(nCurSel);

if(nCurSel == 0 && (m_list.GetCount() != 0))

m_list.SetCurSel(nCurSel);

else if(m_list.GetCount() != 0)

m_list.SetCurSel(nCurSel-1);

// 移动记录指针到新的位置

OnSelchangeList();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

}

查询按钮对应的函数代码如下:

//名称:OnQuery()

//功能:按照学号和姓名查询学生信息,如果只输入学号则只按照学号查询

//只输入姓名则只按照姓名查询,两者都没有输入则查询所有学生信息

void CExec2Dlg::OnQuery()

{

UpdateData(TRUE);

//构造Sql语句

//为简单考虑,这里只把学号和姓名作为查询条件

CString strSql;

if(m_sname != "" && m_sno != "")

strSql.Format("SELECT * FROM s WHERE sname = '%s' AND sno = '%s'",

m_sname,m_sno);

else if(m_sname != "" && m_sno == "")

strSql.Format("SELECT * FROM s WHERE sname = '%s'",m_sname);

else if(m_sname == "" && m_sno != "")

strSql.Format("SELECT * FROM s WHERE sno = '%s'",m_sno);

else

strSql = "SELECT * FROM s";

try

{

//先关闭已经打开的记录集对象

m_pRecordset->Close();

//根据新的Sql查询语句,重新打开记录集对象

m_pRecordset->Open(strSql.AllocSysString(),

theApp.m_pConnection.GetInterfacePtr(),

adOpenDynamic,

adLockOptimistic,

adCmdText);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

//将查询后得到的新记录集显示出来

ListData();

}

刷新按钮对应的函数代码如下:

//名称:OnRefresh

//功能:刷新编辑框和列表框

void CExec2Dlg::OnRefresh()

{

m_sno="";

m_sname="";

m_age="";

m_dept="";

m_comment="";

m_list.ResetContent();

UpdateData(false);

}

5)运行结果

23

推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
author-avatar
空心悟心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有