急!!VC+ODBC+SQL2000连接步骤,及代码

我是一个新手,我想,把用SQL2000建立的数据库和VC++连接起来,使用ODBC类型,主要是想实现在对话框中显示数据库信息,但不知道该怎样添加代码,以及添加什么代码,急... 我是一个新手,我想,把用SQL2000建立的数据库和VC++连接起来,使用ODBC类型,主要是想实现在对话框中显示数据库信息,但不知道该怎样添加代码,以及添加什么代码,急需详细的数据库连接步骤,谢谢帮忙啊 展开
 我来答
happynewyear76
推荐于2016-09-30
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
Visual C++提供了一个名为Enroll的例子来作为学习MFC数据库编程的教程.Enroll分为四步,本节的任务就是指导读者完成前三步的Enroll例程,并对其进行较彻底的剖析.通过学习这三步例程,读者将掌握用AppWizard和ClassWizard创建MFC数据库应用程序的方法.

在开始学习Enroll例程时,读者也许会感到用AppWizard创建数据库应用很容易,似乎不用学习前面几节的内容.诚然,AppWizard自动地为应用程序加入了许多与数据库有关的代码,大大简化了数据库应用的开发.但AppWizard不是万能的,它建立的数据库应用往往不能满足用户的需要.用户真正想知道的是如何不依赖AppWizard而编写自己的数据库应用程序,这也正是本章的宗旨所在.事实上,前面几节的分析以及后面进行的对Enroll例程的分析正是为这一宗旨服务的.

在学习Enroll以前,请读者先从Visual C++ 5.0的光盘上将Enroll(在samples \ mfc \ tutorial \ enroll目录下)在前三步的例程拷到硬盘上,以供参考.另外,Enroll要用到Access数据库STDRED32.MDB,该文件在VC5.0的Stdreg例程中(在samples \ mfc \ database \ stdreg目录下),请读者将该例子也拷贝到硬盘上.

10.7.1 注册数据源

ODBC应用程序不能直接使用数据库,用户必需为要使用的数据库注册数据源.注册数据源的工作由ODBC管理器完成,该管理器位于Windows 95控制面板的32位ODBC内.现在让我们为Access数据库STDREG32.MDB注册数据源.

打开控制面板,双击“32位ODBC”图标,则会显示一个“ODBC数据源管理器”,如图10.5所示。在管理器中选择“用户DSN”页,用户DSN只对用户可见而且只能用户当前机器。

图10.5 ODBC数据源管理器

点击“添加”按钮,则会弹出一个“创建新数据源”对话框。在该对话框中选择Microsoft Access Driver(*.mdb),然后按完成按钮。接下来会显示一个ODBC Microsoft Access 97 Setup对话框,如图10.6所示,该对话框用来把数据库与一个数据源名连接起来。在Data Source Name:栏中输入Student Registration,然后点击Select...按钮,在随后弹出的对话框中找到并选择STDREG32.MDB。连按两个OK按钮后,一个名为Student Registration的新数据源就被注册到了管理器中。

图10.6 ODBC Microsoft Access 97 Setup对话框

提示:如果要为dBase或FoxPro数据库注册数据源,则应该选择一个目录而不是文件作为数据源。这是因为在Access中,一个MDB文件可以包含多张表,因此可以认为一个MDB文件就是一个数据库。而在dBase或FoxPro中,一个DBF文件只能对应一张表,一个数据库可能会包含好几个DBF文件,所以可以认为某一个包含了若干DBF文件的目录是一个数据库。

10.7.2 Enroll的第一个版本

Enroll第一个版本如图10.3所示,该程序具有浏览记录集和修改记录这两个基本功能。在修改了表单中的记录后,移动到一个新的记录上就可以保存对原记录的修改。注意在表单中Course和Section编辑框都是只读的,这是因为这两个字段的内容较重要,用户不能随便修改。Enroll使用了STDREG32.MDB的Section表,该表是一张课程表,其内容如表10.2所示。

现在让我们来建立Enroll应用程序。首先,用AppWizard来完成Enroll程序框架的建立,请读者按下面几步进行:

启动AppWizard,指定一个名为Enroll的MFC工程。

在MFC AppWizard的第一步选择Single document。

在MFC AppWizard的第二步选择Database view without file support,然后点击Data Source...按钮,在Database Options对话框中的ODBC组合框中选择Student Registration数据源,如图10.7所示。然后按“OK”按钮,则会打开一个Select Database Table对话框,如图10.8所示。在该对话框中选择Section表。按OK按钮退出。

在MFC AppWizard的第六步中,将类CEnrollSet改名为CSectionSet,将类CEnrollView改名为CSectionForm。

按Finish按钮,建立Enroll工程。

图10.7 Database Options对话框

图10.8 Select Database Table对话框

打开工作区的类视图,可以发现AppWizard自动创建了一个记录集类CSectionSet和一个记录视图类CSectionForm,这两个类分别是CRecordset和CRecordView的派生类。AppWizard也为CSectionSet类自动创建了域数据成员。

打开工作区的资源视图,读者不难找到一个ID为IDD_ENROLL_FORM的对话框模板,该模板将被记录视图用来显示表单。清除该模板中的所有控件,并把模板的尺寸扩大到183×110,然后按图10.3的式样放置控件。这里可以采取一个偷懒的方法:打开VC5.0已作好的第一个版本Enroll的资源文件(Enroll.rc),找到并打开IDD_ENROLL_FORM对话框模板,按住Ctrl键并用鼠标选择模板中的所有控件,然后按Ctrl+Insert键拷贝所选的控件。切换到自己的IDD_ENROLL_FORM对话框模板,然后按Shift+Insert键把刚才拷贝的控件粘贴到模板中。

接下来的任务是用ClassWizard把表单中的控件与记录集的域数据成员连接起来,以实现控件与当前记录的DDX数据交换。请读者按如下步骤操作:

进入ClassWizard,选择Member Variables页并且选择CSectionForm类。

在变量列表中双击IDC_CAPACITY项,则会显示Add Member Variable对话框。注意该对话框的Member variable name栏显示的是一个组合框,而不是平常看到的编辑框。如图10.9所示,在组合框的列表中选择m_pSet->m_Capacity。按OK按钮确认。

仿照第2步,为其他控件连接记录集的域数据成员。根据控件的ID,不难确定对应的域数据成员。

图10.9 Add Member Variable对话框

在CSectionForm类的定义内可以找到下面一行:

CSectionSet* m_pSet;

可见m_pSet是CSectionForm类的成员,它指向一个CSectionSet对象。用ClassWizard可以把控件与象记录集这样的“外部数据”连接起来,这是ClassWizard在数据库编程方面的一个特殊应用。

编译并运行Enroll,读者会惊奇的发现Enroll居然是一个相当不错的记录浏览器,并且用户可以对记录进行修改。

现在,让我们来分析一下AppWizard和ClassWizard为Enroll干了哪些事情。

在文档类CEnrollDoc的定义中,有如下一行:

CSectionSet m_sectionSet;

可见AppWizard在CEnrollDoc类中嵌入了一个CSectionSet对象。这相当于调用了构造函数CSectionSet(NULL),CSectionSet类的构造函数的声明如下:
CSectionSet(CDatabase* pDatabase = NULL);

函数的定义在清单10.5中列出。可以看出,构造函数调用了基类的构造函数,并对域数据成员进行了初始化。通过10.5.4我们知道,若传递NULL参数给CRecordset的构造函数,那么CRecordset::Open函数将自动构建一个CDatabase对象,并根据CRecordset:: GetDefaultConnect返回的连接字符串建立与数据源的连接。CSectionSet提供了虚拟函数GetDefaultConnect的新版本,如清单10.6所示,在该函数中提供了数据源Student Registration。

清单10.5 CSectionSet的构造函数

CSectionSet::CSectionSet(CDatabase* pdb)

: CRecordset(pdb)

{

//{{AFX_FIELD_INIT(CSectionSet)

m_CourseID = _T("");

m_SectionNo = _T("");

m_InstructorID = _T("");

m_RoomNo = _T("");

m_Schedule = _T("");

m_Capacity = 0;

m_nFields = 6;

//}}AFX_FIELD_INIT

m_nDefaultType = snapshot;

}

清单10.6 派生类的GetDefaultConnect函数

CString CSectionSet::GetDefaultConnect()

{

return _T("ODBC;DSN=Student Registration");

}

至于记录集的建立,实际上是在CRecordView:: OnInitialUpdate中完成的,这部分代码对用户是透明的,这里在清单10.7中列出。在该函数中调用CRecordset::Open来建立记录集。在函数的开头调用了OnGetRecordset函数来获取与记录视图相连的记录集对象。CSectionForm提供了虚拟函数OnGetRecordset的新版本,如清单10.8所示,该函数把m_pSet提交给调用者。至于m_pSet的初始化,则是在CSectionForm::OnInitialUpdate函数中完成的,如清单10.9所示。

清单10.7 CRecordView:: OnInitialUpdate函数

void CRecordView::OnInitialUpdate()

{

CRecordset* pRecordset = OnGetRecordset();

// recordset must be allocated already

ASSERT(pRecordset != NULL);

if (!pRecordset->IsOpen())

{

CWaitCursor wait;

pRecordset->Open();

}

CFormView::OnInitialUpdate();

}

清单10.8 派生类的OnGetRecordset函数

CRecordset* CSectionForm::OnGetRecordset()

{

return m_pSet;

}

清单10.9 派生类的OnInitialUpdate函数

void CSectionForm::OnInitialUpdate()

{

m_pSet = &GetDocument()->m_sectionSet;

CRecordView::OnInitialUpdate();

}

注意到在CRecordView:: OnInitialUpdate中调用CRecordset::Open时未提供任何参数,这意味着Open函数将从CRecordset::GetDefaultSQL中获取SQL信息。CSectionSet提供了虚拟函数GetDefaultSQL的新版本,如清单10.10所示,该函数返回了“Section”表名。

清单10.10 派生类的GetDefaultSQL函数

CString CSectionSet::GetDefaultSQL()

{

return _T("[Section]");

}
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
bmouth
2008-05-01 · TA获得超过910个赞
知道小有建树答主
回答量:152
采纳率:0%
帮助的人:0
展开全部
没找过书吗?网上好像比较少有完整的介绍,这里很难写,我之前看过一本书叫《SQL Server 2000 案例教程》,廖望等编著,冶金工业出版社,里面的步骤很详细,是比较简单的,又有附光盘和代码。你可以去找找看,还有很多其他书介绍这方面的知识,不过现在用ODBC好像有点落伍了,ADO貌似更好用点。

如果找不到书的话发邮件给我,我这里还保留有书上的一些代码,bmouth@sina.com
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式