基于ODBC的数据库应用(MFC)

文章目录

    • 1.预备知识
      • 1.数据库概述
        • 1.数据库和DBMS
        • 2.结构化查询语言SQL(Structured Query Language)
        • 3.数据库方式种类
          • 1.ODBC(Open DataBase Connectivity)开放数据库连接
          • 2.DAO(Data Access Objects)数据访问对象
          • 3.OLE DB(OLE数据库)
      • 2.MFC ODBC
        • 1.`CRecordset`类
          • 构造
          • 记录集属性
          • 记录集更新操作
          • 记录集定位操作
          • 其他记录集操作
          • 记录集重载函数
        • 2.`CDatabase`类
          • 构造函数
          • 数据库属性
          • 数据库操作
      • 3.ADO
        • 1.技术特点
        • 2.对象模型
        • 3.ADO中的智能指针
    • 2.实验目的
    • 3.实验内容
    • 4.代码实现
      • 1.注册数据库
      • 2.创建项目
      • 3.资源类设置
      • 4.关联数据库与控件
      • 5.数据显示操作
        • 1.定位到上一条数据
        • 2.定位到下一条数据
        • 3.定位到最后一条数据
        • 4.定位到第一条数据
      • 6.数据修改操作
        • 1.添加数据
        • 2.删除数据
        • 3.修改数据
      • 7.其它操作
        • 1.按照姓名查找该学生所有成绩
        • 2.按照成绩排序
    • 5.运行结果
    • 6.总结
      • 1.实验中遇到的困难
        • 如何注册数据库
        • 如何允许对数据库进行修改操作
      • 2.心得体会

1.预备知识

1.数据库概述

1.数据库和DBMS

数据库是指以一定的组织形式存放在计算机上的相互关联的数据的集合。一般一个库中有多个表组成,一张表中由多条记录组成,一条记录由若干字段组成。

例:
学生信息库——基本信息表、成绩表
基本信息表——每个学生的基本信息记录
基本信息记录——姓名、性别、年龄、专业等字段组成

DBMS数据库管理系统为用户提供对数据库操作的各种命令、工具及方法。

例:Access/Oracle/SQL Sever等等

2.结构化查询语言SQL(Structured Query Language)

专用于查询或修改关系型数据库的查询语言

  • 最早由IBM公司开发出来,现已成为ISO国际标准,广泛应用于数据库管理系统
  • 一种简单、易懂的查询语言
SQL语言的6种句式
句式说明
SELECT用于查询数据库,可以一次查询一个或多个表,选择需要的列,并设置查询条件,形成特定的查询结果集,这是最常用的SQL命令
CREATE主要用于在数据库中创建新表
DROP删除数据库中的表
INSERT向数据库中的表插入记录
DELETE删除数据库中表中的满足特定条件的记录
UPDATE修改数据库中表中的记录的值
SQL语言的最常用从句
从句说明
FROM从句用于指定要查询的表的名称,可以有多个表,各个表之间使用逗号(,)隔开
WHERE从句指定查询条件,只有那些满足条件的记录才包含在结果中
ORDER BY从句指定查询结果集按照指定的列的顺序排列,可以升序(ASC),也可以降序(DESC
SQL语言的逻辑运算符
运算符说明
AND逻辑“与”,即仅当两个条件都满足时才为真。
OR逻辑“或”,即仅当两个条件都不满足时才为假。
NOT逻辑“非”,即取反操作。
3.数据库方式种类

Visual C++为用户提供了ODBC、DAO及OLE DB三种数据库方式。这三种方式中最简单也最常用的是ODBC,因此本实验使用MFC的ODBC。

1.ODBC(Open DataBase Connectivity)开放数据库连接

ODBC提供了应用程序接口API。使得任何一个数据库都可以通过ODBC驱动器与指定的DBMS相联。用户的程序可以通过调用ODBC驱动管理器中相应的驱动程序达到管理数据库的目的。访问数据库时,是由ODBC管理器将应用程序的数据库访问请示传递给相应的数据库驱动程序,驱动程序再用SQL语句完成DBMS的访问任务。

2.DAO(Data Access Objects)数据访问对象

DAO使用Microsoft Jet提供的数据库访问对象集直接访问DBMS,速度比ODBC要快。

3.OLE DB(OLE数据库)

OLE DB是一种高性能的、基于COM(组件对象模型)的数据库技术。

2.MFC ODBC

开放数据库接口ODBC是一种标准的基于SQL的接口,提供了应用程序与数据库之间的接口,使得任何一个数据库都可以通过ODBC驱动器与指定的DBMS相联。使用ODBC能使用户编写数据库应用程序变得容易简单,避免了与数据库相连接的复杂性。ODBC的组成见下图:
0

ODBC管理器:位于控制面板
驱动程序管理器:ODBC32.dll
ODBC驱动程序:以DLL文件形式出现

MFC类库中提供了两个有关ODBC对数据库操作的类:CDatabaseCRecordset

CDatabase类:包含有数据库的连接信息,可以在整个应用程序中共享这些信息,一个Cdatabase对象代表了一个与数据源的连接,通过它可以对数据源进行操作。

CRecordset类:针对数据源中的记录集,负责对记录的操作。一个CRecordset对象代表了一组从数据源查询出来的记录,称为记录集。记录集从数据源中查询出数据,然后再进行添加、排序等操作。

  • 快照记录集(snapshot):数据集的一个静态视图
  • 动态记录集(Dynaset):能保持与其它用户所作的更改保持同步

使用记录集对象,首先应建立与数据源的连接,这时应当创建并初始化CDatabase对象,然后将创建的CDatabase对象的指针传给CRecordset对象的构造函数,这样记录对象创建成功,最后使用Open()函数对数据源进行数据查询。

  • CRecordView类:负责界面,以视图形式显示数据库记录。CRecordView类是在控件中显示数据库记录的视图对象,是直接连接到CRecordView对象上的表单视图。
  • CDBException:负责处理MFC ODBC在操作数据库时发生的异常。
1.CRecordset

CRecordset对象代表从一个数据源选择的一组记录的集合,被称作“记录集”。CRecordset对象可以以两种形式使用:动态集和快照。动态集是与其它用户的更新保持同步的动态数据集。快照是数据的静态视图。每一种形式都代表打开记录集时固定的一组记录。但是当滚动到动态集中的一个记录时,动态集将反映后来由其它用户或由应用程序中其它记录集对此记录所做的改变。

注意:

如果正在使用数据访问对象(DAO)类,而不是打开数据库连接(ODBC)类,请使用类CDaoRecordset来代替。

要使用任何一种记录集,通常需要从CRecordset派生一个应用程序指定的记录集类。记录集从一个数据源中选择记录,然后就可以:

  • 更新记录并指定一种加锁模式。
  • 过滤记录集,以获得那些从数据源中选择出来的可利用的记录。
  • 给记录集排序。
  • 参数化该记录集以定制它的具有要直到运行时才知道的信息的选项。

打开一个数据库并构造一个记录集对象,给构造函数传递一个指向CDatabase对象的指针。然后调用记录集的Open成员函数,在此可以指定该对象是一个动态集还是一个快照。调用Open来从数据源中选择数据。在记录集对象被打开之后,用它的成员函数和数据成员来滚动和操作记录。可用的操作根据对象是一个动态集还是一个快照(这依赖于打开数据库连接(ODBC)数据源的性能),是可更新的还是只读的,是否实现了成组行检取而不同。为了刷新从调用Open以来可能被改变或添加的记录,可以调用对象的Requery成员函数。当使用完对象之后,调用对象的Close成员函数,并销毁此对象。

在一个派生的CRecordset类中,使用记录字段交换(RFX)或成组记录字段交换(Bulk RFX)来支持读取和更新记录字段。

数据成员
变量名说明
m_hstmt包含记录集的ODBC语句句柄。类型为HSTMT
m_nFields包含记录集中的字段数据成员数目。类型为UINT
m_nParams包含记录集中参数数据成员的数目。类型为UINT
m_pDatabase包含一个指向CDatabase对象的指针,提供该指针将记录集连接到一个数据源
m_strFilter包含一个CString,此对象指定一条结构式查询语言(SQL)的WHERE子句。此成员可用作一个过滤器,只选择符合某一标准的那些记录
m_strSort包含一个CString,此对象指定一条SQL ORDERBY子句。此成员可用于控制记录的排序
构造
函数说明
CRecordset构造一个CRecordset对象。应用程序的派生类必须提供一个调用此函数的构造函数
Open通过检取记录集表示的表格或执行查询来打开记录集
Close关闭记录集和与此记录集相关联的ODBCHSTMT
记录集属性
函数说明
CanAppend如果新记录可以通过
AddNew成员函数增加到记录集中,则该函数返回一个非零值
CanBookmark如果记录集支持书签则函数返回一个非零值
CanRestart如果可以调用Requery来再次运行记录集的查询,则该函数返回一个非零值
CanScroll如果应用程序可以滚动记录,则该函数返回一个非零值
CanTransact如果数据源支持事务,则该函数返回一个非零值
CanUpdate如果记录集可修改(应用程序可以增加、修改或删除记录),则该函数返回一个非零值
GetODBCFieldCount返回记录集中的字段数目
GetRecordCount返回记录集中的记录数目
GetStatus获取记录集的状态:读取记录的索引,以及是否已获取到记录的最终计数
GetTableName获取此记录集基于的表的名字
GetSQL获取用于选择记录集的记录的SQL字符串
IsOpen如果前面已经调用了Open函数,则此函数返回一个非零值
IsBOF如果记录集已经定位在第一个记录前,则此函数返回一个非零值
IsEOF如果记录集已经定位在最后一个记录后,则此函数返回一个非零值
IsDeleted如果记录集定位在一个已删除的记录上,则该函数返回一个非零值
记录集更新操作
函数说明
AddNew为增加新记录作准备。调用Update来完成增加
CancelUpdate取消任何用AddNewEdit操作指定的未决定的更新
Delete从记录集中删除当前记录。删除之后,应用程序必须显式地滚动到另一个记录
Edit为改变当前记录作准备。调用Update来完成编辑
Update通过将新数据或所编辑的数据保存到数据源上,来完成一次AddNewEdit操作
记录集定位操作
函数说明
GetBookMark将一个记录的标签值分配给该参数对象
Move将记录集双向定位到距离当前记录指定数目的记录的位置
MoveFirst定位当前记录为记录集中的第一个记录。该函数首先测试IsBOF
MoveLast定位当前记录为记录集中的最后一个记录。该函数首先测试IsEOF
MoveNext定位当前记录为记录集中的下一个记录。该函数首先测试IsEOF
MovePrev定位当前记录为记录集中的第一个记录。该函数首先测试IsBOF
SetAbsolutePosition将记录集定位到与指定的记录数相对应的位置
SetBookmark定位记录集到书签指定的位置
其他记录集操作
函数说明
Cancel取消一次异步操作或一次来自第二线程的处理
FlushResultSet当使用一个预定义的查询时,如果有另外一个结果被获取,返回非零值
GetFieldValue返回记录集中的一个字段的值
GetODBCFieldInfo返回记录集中各字段的指定类别的信息
GetRowsetSize返回在一次单个获取中你要获取的记录数目
GetRowsFetched返回在一次获取中实际获取的行数
GetRowStatus返回在一次获取中行的状态
IsFieldDirty如果在当前记录中的指定字段被改变,则返回一个非零值
IsFieldNull如果当前记录中的指定字段是Null(没有值),则返回非零值
IsFieldNullable如果当前记录中的指定字段可被设置为Null(没有值),则返回非零值
RefreshRowset刷新指定行的数据和状态
Requery再次运行记录集的查询来刷新所选择的记录
SetFieldDirty标记当前记录中的指定字段是被改变的
SetFieldNull设置当前记录中的指定字段的值为Null(没有值)
SetLockingMode将加锁模式设置为“乐观”加锁(缺省值)或“悲观”加锁。确定任何更新加锁记录
SetParamNull将指定的参数设置为Null(没有值)
SetRowsetCursorPosition将游标定位在记录集中的指定行上
记录集重载函数
函数说明
Check用来检查从一个ODBC API函数返回的代码
CheckRowSetError用来处理在获取记录期间产生的错误
DoBulkFieldExchange用来将一组数据行从数据源中交换到记录集中。实现成组记录交换(BulkRFX
DoFieldExchange用来在此记录集的字段数据成员和数据源上对应的记录之间交换数据(双向)。双向记录字段交换(RFX
GetDefaultConnect用来获取缺省的字符串
GetDefaultSQL用来获取要执行的缺省的SQL字符串
OnSetOptions用来为指定的ODBC语句设置选项
SetRowsetSize指定在一次获取中你希望获取的记录数目
2.CDatabase

CDatabase对象表示到数据源的连接,通过它可以操作数据源。数据源是位于一些数据库管理系统(DBMS)的数据的指定实例,包括MicrosoftSQL Server,Microsoft Access,Borland dBASE和xBASE。在应用中可以同时使一个或多个CDatabase对象活动。

注意:如果在处理数据访问对象(DAO)类而不是开放数据库连接(ODBC)类,可使用类CDaoDatabase。为使用CDatabase,构造一个CDatabase对象并调用它的OpenEx成员函数。这打开了一个连接。在接着构造CRecordset对象以操纵连接的数据源时,向CDatabase对象传递记录集构造程序指针。完成使用连接时调用Close成员函数并销毁CDatabase对象。Close关闭以前没有关闭的任何记录集。

构造函数
函数说明
CDatabase构造一个CDatabase对象。必须通过调用OpenExOpen初始化这个对象
Open建立到数据源的一个连接(通过ODBC驱动程序)
OpenEx建立到数据源的一个连接(通过ODBC驱动程序)
Close关闭数据源连接
数据库属性
函数说明
GetConnect返回用于连接CDatabase对象和数据源的ODBC连接字符串
IsOpen如果CDatabase对象当前与数据源连接,则返回非零
GetDatabaseName返回当前使用的数据库名字
CanUpdate如果CDatabase可更新(不是只读的),则返回非零
CanTransact如果数据源支持事务,则返回非零
SetLoginTimeout设置数据源连接试图超时的秒数
SetQueryTimeout设置数据库查询操作超时的秒数。影响以后的所有记录集调用:OpenAddNewEditDelete
GetBookmarkPersistence标识记录集对象上书签持久化操作
GetCursorCommitBehavior标识在打开的记录集对象上提交事务的效果
GetCursorRollbackBehavior标识在打开的记录集对象上回滚事务的效果
数据库操作
函数说明
BeginTrans在连接的数据源上开始“事务”──类CRecordset的一系列可回滚的AddNewEditDeleteUpdate成员函数调用。数据源必须支持事务才能使BeginTrans有效
BindParameters允许在调用CDatabase::ExecuteSQL前绑定参数
CommitTrans完成由从BeginTrans开始的事务。执行这个事务中改变数据源的命令
Rollback回滚当前事务期间所做变化,数据源返回到BeginTrans调用时定义的未改变的以前状况
Cancel取消第二个线程的异步操作或处理
ExecuteSQL执行一条SQL语句。不返回数据记录

3.ADO

ADO(ActiveX Data Object)是Microsoft的数据库应用程序开发的新接口,是建立在OLE DB之上的高级数据库访问技术。

ADO技术基于COM(Component Object Model),具有COM组件的诸多优点,可以用来构造可复用应用框架,被多种语言支持,能够访问关系数据库、非关系数据库以及所有的文件系统。

另外,ADO还支持各种客户/服务器模式与基于Web的数据操作,具有远程数据服务RDS(Remote Data Service)的特性,是远程数据存取的发展方向。

1.技术特点
  • 易于使用
  • 高速访问数据源
  • 可以访问不同的数据源
  • 可以用于Microsoft ActiveX页
  • 程序占用的内存少
2.对象模型

ADO对象模型提供了7种对象、4种集合。分别为:

  • 连接对象Connection
  • 命令对象Command
  • 参数对象Parameter
  • 记录集对象Recordset
  • 字段对象Field
  • 属性对象Property
  • Errors集合
  • Parameters集合
  • Fields集合
  • Properties集合
3.ADO中的智能指针

ADO模型中常用的对象:Connection对象、Command对象、Recordset对象,在使用这3个对象的时候,需要定义与之对应的3个智能指针,分别为

  • _ConnectionPtr
  • _CommandPtr
  • _RecordsetPtr

2.实验目的

掌握MFC的ODBC和ADO链接后台数据库的编程方法和技巧。

3.实验内容

创建一个支持ODBC或者ADO的数据库的SDI应用程序:

  1. 可以检索studentmarks.mdb(学生成绩表)表中的记录(可以查看上一条,下一条,最后一条,最初一条)
  2. 用户可以添加,修改和删除记录
  3. 按照成绩排序
  4. 按照姓名查找该学生所有成绩

4.代码实现

1.注册数据库

  1. 打开控制面板的管理工具,选择“ODBC Data Sources (32-bit)”并打开如下:
    在这里插入图片描述
  2. 点击“添加”并选择“Microsoft Access Driver (.mdb)”如下:
    在这里插入图片描述
  3. 最后选择数据库文件并命名即可。
    在这里插入图片描述

2.创建项目

打开MFC应用程序向导,选择单文档、MFC标准后进入数据库支持页面,设置如下:
在这里插入图片描述
然后点击“数据源”后选择机器数据源,然后选择刚刚在控制面板添加的数据源即可。
在这里插入图片描述
输入电脑的登录用户与密码后即可创建项目。

3.资源类设置

首先创建5个文本编辑框用于显示数据(因为本实验中只有5个字段),并依次添加按钮用于功能实现:
在这里插入图片描述

4.关联数据库与控件

根据数据库源文件中相应的成员

void CEx7Set::DoFieldExchange(CFieldExchange* pFX)
{
	pFX->SetFieldType(CFieldExchange::outputColumn);
// RFX_Text() 和 RFX_Int() 这类宏依赖的是
// 成员变量的类型,而不是数据库字段的类型。
// ODBC 尝试自动将列值转换为所请求的类型
	RFX_Long(pFX, _T("[编号]"), column1);
	RFX_Text(pFX, _T("[studentnum]"), m_studentnum);
	RFX_Text(pFX, _T("[studentname]"), m_studentname);
	RFX_Text(pFX, _T("[subject]"), m_subject);
	RFX_Long(pFX, _T("[mark]"), m_mark);
}

在视图类里添加相应绑定函数即可:

void CEx7View::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	// 可以在此处插入 DDX_Field* 函数以将控件“连接”到数据库字段,例如
	// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);
	// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);
	// 有关详细信息,请参阅 MSDN 和 ODBC 示例
	DDX_FieldText(pDX, IDC_EDIT1, m_pSet->column1, m_pSet);
	DDX_FieldText(pDX, IDC_EDIT2, m_pSet->m_studentnum, m_pSet);
	DDX_FieldText(pDX, IDC_EDIT3, m_pSet->m_studentname, m_pSet);
	DDX_FieldText(pDX, IDC_EDIT4, m_pSet->m_subject, m_pSet);
	DDX_FieldText(pDX, IDC_EDIT5, m_pSet->m_mark, m_pSet);
	DDX_Text(pDX, IDC_EDIT6, m_strQuery);
}

5.数据显示操作

1.定位到上一条数据
// 上一条
void CEx7View::OnBnClickedButton1()
{
	if (m_pSet->IsOpen())
	{
		m_pSet->MovePrev();
		if (m_pSet->IsBOF())
			MessageBox(TEXT("当前已经为第1条记录!"));
		else
			UpdateData(FALSE);
	}
}
2.定位到下一条数据
// 下一条
void CEx7View::OnBnClickedButton2()
{
	if (m_pSet->IsOpen())
	{
		m_pSet->MoveNext();
		if (m_pSet->IsEOF())
			MessageBox(TEXT("当前已经为最后一条记录!"));
		else
			UpdateData(FALSE);
	}
}
3.定位到最后一条数据
// 最后一条
void CEx7View::OnBnClickedButton3()
{
	if (m_pSet->IsOpen())
	{
		m_pSet->MoveLast();
		UpdateData(FALSE);
	}
}
4.定位到第一条数据
// 最初一条
void CEx7View::OnBnClickedButton4()
{
	if (m_pSet->IsOpen())
	{
		m_pSet->MoveFirst();
		UpdateData(FALSE);
	}
}

6.数据修改操作

1.添加数据

首先定义一个设定各属性值为空的宏:

#define SET_FIELD_NULL                                     \
	m_pSet->SetFieldNull(&(m_pSet->column1), FALSE);       \
	m_pSet->SetFieldNull(&(m_pSet->m_studentnum), FALSE);  \
	m_pSet->SetFieldNull(&(m_pSet->m_studentname), FALSE); \
	m_pSet->SetFieldNull(&(m_pSet->m_subject), FALSE);     \
	m_pSet->SetFieldNull(&(m_pSet->m_mark), FALSE);

接着实现数据的添加:

// 添加
void CEx7View::OnBnClickedButton5()
{
	m_pSet->AddNew();
	SET_FIELD_NULL
	UpdateData(TRUE);
	m_pSet->Update();
	m_pSet->Requery();
	MessageBox(TEXT("添加成功!"));
}
2.删除数据
// 删除
void CEx7View::OnBnClickedButton7()
{
	if (MessageBox(TEXT("真的要删除该记录吗?"), TEXT("删除记录"), MB_YESNO | MB_ICONQUESTION) == IDYES)
	{
		m_pSet->Delete();
		m_pSet->MoveNext();
		if (m_pSet->IsEOF())
			m_pSet->MoveLast();
		if (m_pSet->IsBOF())
			m_pSet->SetFieldNull(NULL);
		UpdateData(FALSE);
		MessageBox(TEXT("删除成功!"));
	}
}
3.修改数据
// 修改
void CEx7View::OnBnClickedButton6()
{
	m_pSet->Edit();
	UpdateData(TRUE);
	m_pSet->Update();
	m_pSet->Requery();
	MessageBox(TEXT("修改成功!"));
}

7.其它操作

1.按照姓名查找该学生所有成绩
// 查询
void CEx7View::OnBnClickedButton8()
{
	UpdateData(TRUE);
	m_pSet->m_strFilter = TEXT("[studentname]='") + m_strQuery + TEXT("'");
	m_pSet->Requery();
	UpdateData(FALSE);
}
2.按照成绩排序
// 按成绩排序
void CEx7View::OnBnClickedButton9()
{
	m_pSet->m_strSort = "mark";
	m_pSet->Requery();
	UpdateData(FALSE);
}

5.运行结果

在这里插入图片描述
点击下一条:
在这里插入图片描述
定位到最后一条:
在这里插入图片描述
继续下一条:
在这里插入图片描述
添加数据:

在这里插入图片描述
在这里插入图片描述
再删除数据:

在这里插入图片描述
在这里插入图片描述
查找“李四”的成绩:

在这里插入图片描述

6.总结

1.实验中遇到的困难

如何注册数据库

我使用的是visual studio 2013,可能由于版本不兼容的原因,如果使用64位“ODBC数据源管理器”,在创建项目的时候会导致数据源链接失败,使用32位的可以解决问题。

如何允许对数据库进行修改操作

在创建项目的时候需要选择类型为“动态集”,如果选择“快照”会导致只读异常。

2.心得体会

在完成这个MFC的ODBC和ADO数据库连接的实验过程中,我学到了许多关于MFC框架和数据库编程的知识和技巧。

在实验开始阶段,需要注册数据库以及在应用程序中建立与数据库的连接。这一步是整个数据库编程的基础,需要确保正确配置ODBC数据源,并在应用程序中正确设置连接信息。通过MFC的数据视图类和数据交换机制,将数据库中的字段与界面上的控件关联起来。这样,可以通过控件直接显示和修改数据库中的数据,使用户界面与数据库之间实现了双向的数据交互。编写代码实现对数据库中数据的显示和操作是关键的一步。例如,通过MoveNextMovePrev等函数实现记录的导航,通过AddNewEditUpdate等函数实现对记录的添加、修改和删除。实现了按条件查询和按特定字段排序的功能,这是实际应用中常见的需求。在这个实验中,通过设置过滤条件和排序方式,可以在界面上方便地对数据进行筛选和排序。在操作数据库的过程中,需要考虑到可能出现的异常情况,例如记录已经是第一条或最后一条时的处理。通过合理的异常处理,可以提高程序的稳定性和用户体验。在实验中,使用了宏来简化一些重复的操作,例如设置字段为空。这种技巧有助于提高代码的可维护性和可读性。实验中综合运用了多种数据库操作,包括导航、修改、添加、删除、查询和排序等。这样的实践有助于深入理解数据库编程的全过程。

总的来说,通过这个实验,我对MFC框架下使用ODBC和ADO连接数据库的方法有了更深入的理解,并学到了在实际项目中如何设计和实现与数据库的交互功能。这些知识和经验对于日后从事Windows平台下的应用程序开发将会有很大的帮助。

代码地址:https://github.com/zsc118/MFC-exercises

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制作更好的待办事项清单的方法有哪些?

在忙碌的工作、学习或生活中,我们都渴望变得更加自律,希望每件事都能有目标、有计划地高效完成。而要实现这一愿望,一个精心制作的待办事项清单无疑是不可或缺的。那么,制作更好的待办事项清单的方法有哪些?高效的待办…

C++深入学习之模板

为什么需要模板 先来看下面一段程序: int add(int x, int y) {return x y; }double add(double x, double y) {return x y; }long add(long x, long y) {return x y; }string add(string x, string y) {return x y; }//T1 T2 T3 T3 add(T1 x, T2 y) {return…

Apache ActiveMQ 远程代码执行漏洞分析

漏洞简介 Apache ActiveMQ官方发布新版本,修复了一个远程代码执行漏洞,攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行,从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

docker部署firefox浏览器,实现远程访问

拉取firefox镜像,部署代码 docker run -d --name firefox -e TZAsia/Hong_Kong -e DISPLAY_WIDTH1920 -e DISPLAY_HEIGHT1080 -e KEEP_APP_RUNNING1 -e ENABLE_CJK_FONT1 -e VNC_PASSWORD12345678ABCabc -p 5800:5800 -p 5900:5900 -v /docker/firefox/config:/…

阿里云计算平台大数据基础工程技术团队直聘!!!

大数据基础工程技术团队,隶属于阿里云智能集团计算平台事业部,是一支负责阿里集团、公共云和混合云场景计算平台大数据&AI产品的稳定性建设、架构&成本优化、运维产品ABM(Apsara Big data Manager)研发和售后技术专家支持…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释(主题)★ 主题★ 分区★ 创建主题:★ 列出和查看主题 CMAK 各个功能的作用解释(主题) ★ 主题 Kafka 主题虽然也叫 topic,但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

好用的AI写作软件,这6款助你轻松写作

这几年,AI在线写作平台在国内市场上呈现出蓬勃发展的态势,这些写作软件能够帮助用户快速生成高质量的文章。下面我将介绍国内的6款AI在线写作平台,一起来看看吧! 第一个爱制作AI 爱制作AI是拥有智能创作的AI在线写作平台之一&…

深兰科技AI医疗健康产品获3000台采购订单

12月6日,武汉某企业与深兰科技签署协议,一次性采购3000台深兰科技AI生理健康检测仪——扁鹊。 深兰科技AI生理健康检测仪——扁鹊是深兰科技推出的人体生理指标检测产品。基于AI生物技术、融合互联网医疗及AIoT技术,深兰科技AI生理健康检测仪…

限制选中指定个数CheckBox控件(2/2)

实例需求:工作表中有8个CheckBox控件(下文中简称为控件),现在需要实现限制用户最多只能勾选4个控件。 在上一篇博客中已经实现了这个需求,其基本思路是用户选中第5个控件时,事件代码将取消勾选最后一个选中…

弱光图像增强算法(6大算法附程序),一站式解决论文实验比较部分

过往几年大量从事弱光图像增强的炒菜工作。 为了方便科研比较,也就是主观视觉比较和定量比较,提供一个集成程序给各位参考 非常简单,只需要点击Main.PY和修改输出的路径即可 本次收集的6类算法(EnlightenGAN, RUAS, SCI, ZeroDCE, ZeroDCE…

python封装接口自动化测试套件 !

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中,音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎,它们不仅可以在运动时提供音乐的陪伴,还能增加运动时的乐趣和动力。但是,面对市面上众多不同类型的运动耳机,…

Linux进程通信之管道

目录 1、无名管道 1.无名管道的特点 2.pipe函数创建管道 3.图例 2、命名管道(FIFO) 1.命名管道的特点 2.mkfifo 函数-创建命名管道 3.示例 1.循环读取数据 2.循环写入数据 1、无名管道 管道通常指的就是无名管道, 1.无名管道的特点…

校招行测,认知能力测验,④破解数量关系测试题

数量关系,值得是数量计算、对比和分析,每种题型都有一定的规律性,如果善于终结也是容易掌握的,当然,只有见多,才能识广,最好的方式就是,锻炼,刷题,就算是临时…

3D Web可视化开发工具包HOOPS Communicator:提供Web端浏览大型模型新方案!

前言:HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模…

类和对象的定义以及使用

文章目录 1. 类和对象的基本概念1.1 JAVA是面向对象语言1.2 类和对象的描述 2. 类与对象的定义与使用2.1 类的定义格式2.2 类的实例化(对象的创建)2.3 举个例子 3. 对象的构造及初始化3.1构造方法3.1.1构造方法的定义3.1.2 构造方法的特性 4.2 默认初始化5.4 就地初始化 4.this…

九州金榜如何让孩子在家庭教育中更优秀

​ 每个人在出生时就有上天恩赐的两份礼物,一份是血脉相连的亲情,一份是家庭的关爱与教育。 最早接触的人就是父母,最早接触的教育就是家庭教育,这对孩子的影响极为深远。 这种家庭教育相比较学校教育,不仅有言传教…

认知能力测验,⑤破解图形推理测试题,校招社招网申在线测评必用

认知能力测试,如今是每个求职者必须要面对的,有的人可以顺顺利利通过,而有的人只能够遗憾止步。想要通过认知能力测验,并不是一件易事,而今天要说的图形推理,仅仅是其中的一个部分,抛砖引玉&…

2024.01.09.Apple_UI_BUG

我是软件行业的,虽然不是手机设计的,但是这个设计真的导致经常看信息不完整,要下拉的。 特别读取文本或者其他文件的时候,上面有个抬头就是看不到,烦,体验感很差

Requests库的接口测试实现

Requests库是在接口测试中被广泛运用的库,包括模拟请求的下发,请求相关配置和响应结果的获取,核心主体都是通过request库完成。在接口测试中使用非常频繁。 一、Requests库环境搭建 接口测试的核心从模拟请求开始。在Python中,通…