急!!VC+ODBC+SQL2000连接步骤,及代码
我是一个新手,我想,把用SQL2000建立的数据库和VC++连接起来,使用ODBC类型,主要是想实现在对话框中显示数据库信息,但不知道该怎样添加代码,以及添加什么代码,急...
我是一个新手,我想,把用SQL2000建立的数据库和VC++连接起来,使用ODBC类型,主要是想实现在对话框中显示数据库信息,但不知道该怎样添加代码,以及添加什么代码,急需详细的数据库连接步骤,谢谢帮忙啊
展开
2个回答
展开全部
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]");
}
在开始学习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-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询