Visual C++ ODBC 参数化记录集查询设计

简介:

ODBC通过RFX自动完成数据源和记录集对象之间的数据传输交换,而通过DDX对话框数据交换实现记录集数据和窗体控件的绑定。本文给出了一个通过GetDefaultSQL的方法设计了一个简单的查询,不过这儿的查询语句是设定好的,灵活性不高,各个条件之间是OR的关系,没法实现复杂的查询。

在使用参数化记录集之前,需要先确定所需的参数。学习所用的数据表如下:

image

这儿将所有的字段都设置为参数,在记录集类定义参数,并初始化:

// 参数定义
long	m_stunum2;
CStringW	m_name2;
CStringW	m_gender2;
long	m_age2;
long	m_classnum2;
 
// 构造函数中初始化
m_stunum2 = 0;
m_name2 = L"*";
m_gender2 = L"*";
m_age2 = 10;
m_classnum2 =1;
m_nParams=5;

在DoFieldExchange中添加参数数据交换函数:

void CdatatestSet::DoFieldExchange(CFieldExchange* pFX)
{
	pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
	RFX_Long(pFX, _T("[学号]"), m_stunum);
	RFX_Text(pFX, _T("[姓名]"), m_name );
	RFX_Text(pFX, _T("[性别]"), m_gender);
	RFX_Long(pFX, _T("[年龄]"), m_age);
	RFX_Long(pFX, _T("[班级编号]"), m_classnum);

	pFX->SetFieldType(CFieldExchange::inputParam);
	RFX_Long(pFX, _T("1”), m_stunum2);
	RFX_Text(pFX, _T("2"), m_name2 );
	RFX_Text(pFX, _T("3"), m_gender2);
	RFX_Long(pFX, _T("4"), m_age2);
	RFX_Long(pFX, _T("5"), m_classnum2);
}

设置查询条件的过滤字符串,串中的参数占位符(?)与上面绑定的顺序一致:

CString CdatatestSet::GetDefaultSQL()
{
	m_strFilter=L"学号=? OR 姓名=? OR 性别=? OR 年龄=? OR 班级编号=?";
	return _T("[学生信息表]");
}

最后在View类中设置数据交换,并编写相应的查询函数:

void CdatatestView::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->m_stunum,m_pSet);
	DDX_FieldText(pDX,IDC_EDIT2,m_pSet->m_name,m_pSet);
	DDX_FieldText(pDX,IDC_EDIT3,m_pSet->m_gender,m_pSet);
	DDX_FieldText(pDX,IDC_EDIT4,m_pSet->m_age,m_pSet);
	DDX_FieldText(pDX,IDC_EDIT5,m_pSet->m_classnum,m_pSet);

	//对话框数据交换
	DDX_Text(pDX,IDC_EDIT6,m_stunum);
	DDX_Text(pDX,IDC_EDIT7,m_name);
	DDX_Text(pDX,IDC_EDIT8,m_sex);
	DDX_Text(pDX,IDC_EDIT9,m_age);
	DDX_Text(pDX,IDC_EDIT10,m_classnum);
}


void CdatatestView::OnMyQuery()
{
	UpdateData(TRUE);	
	m_pSet->m_classnum2=m_classnum;
	m_pSet->m_name2=m_name;
	m_pSet->m_gender2=m_sex;
	m_pSet->m_stunum2=m_stunum;
	m_pSet->m_age2=m_age;
	m_pSet->Requery();
	UpdateData(FALSE);
}

最后的结果如下:

image


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/12/20/1628122.html,如需转载请自行联系原作者


相关文章
|
6月前
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
3862 0
|
7月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
3月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
42 11
|
4月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
5月前
|
安全 编译器 C++
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
这些是Microsoft Visual C++不同版本的Redistributable安装包,用于32位系统,确保相关应用正常运行。它们提供C++运行时环境,简化部署流程,支持第三方库及框架,并确保应用兼容性。定期更新可修复问题并引入新功能。在空间有限或需解决程序冲突时可考虑删除,但需谨慎操作以防影响应用稳定性和兼容性。删除前请确认无应用依赖,并通过控制面板安全卸载。
344 1
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
|
6月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
273 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
5月前
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
5月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
153 0
|
5天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
43 18
|
5天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
31 13