关于m_pSet->Update();m_pSet->Requery()的问题,请高手指教啊

奥斯特里茨 2013-07-30 03:46:16
我根据按一本讲MFC的书写的编的程序,是数据库记录编辑的程序,有几点不明白请高手指教
void CEx_AddressView::OnRecAdd()
{
// TODO: Add your control notification handler code here
CPersonDlg dlg;//弹出了cpersondlg的一个对象,也就是那个对话框
if(dlg.DoModal()==IDOK)//按下ok按钮
{
m_pSet->AddNew();
m_pSet->m___3=dlg.m_strAddress;
m_pSet->m___4=dlg.m_strMail;
m_pSet->m___1=dlg.m_strName;
m_pSet->m___2=dlg.m_strType;
m_pSet->Update();
m_pSet->Requery();
UpdateData(false);//自己加的,不加的话会出现一种奇怪的现象,如在a,b,c,后添加d,会出现c,b,c,d的现象,我不明白为什么? }
}

void CEx_AddressView::OnRecDel()
{
// TODO: Add your control notification handler code here
CRecordsetStatus status;
m_pSet->GetStatus(status);
m_pSet->Delete();

if(status.m_lCurrentRecord==0)
m_pSet->MoveNext();
else
m_pSet->MoveFirst();


m_pSet->Requery();//自己加的,不加它会显示<已删除>,为什么?

UpdateData(false);//把字段传给控件,即在控件中显示
}
还有UpdateData(false);和m_pSet->Update();有什么区别?
m_pSet->Requery()的作用呢?请高手指教,刚刚学MFC,很多东西不明白。。。
...全文
193 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐乐啊乐乐 2015-11-28
  • 打赏
  • 举报
回复
m_pSet->Requery();//自己加的,不加它会显示<已删除> m_pSet->Requery() 是重新查询数据集,如果不加你执行完上面的程序,相当于光标已经在你删除的那条数据处,由于此处数据已经被你删除了,当然显示已删除了, 如果加上m_pSet->Requery() 相当于把光标移动到数据集的第一条数据处。
向立天 2013-07-31
  • 打赏
  • 举报
回复
奥斯特里茨 2013-07-31
  • 打赏
  • 举报
回复
谢谢啊
zyq5945 2013-07-30
  • 打赏
  • 举报
回复
在a,b,c,后添加d,会出现c,b,c,d的现象,这个用order by强制排序来控制。 第二个问题就不清楚了。
奥斯特里茨 2013-07-30
  • 打赏
  • 举报
回复
哦哦,谢谢啊,那UpdateData(false);//自己加的,不加的话会出现一种奇怪的现象,如在a,b,c,后添加d,会出现c,b,c,d的现象,我不明白为什么? 为什么啊??? m_pSet->Requery();//自己加的,不加它会显示<已删除>,为什么?
zyq5945 2013-07-30
  • 打赏
  • 举报
回复
UpdateData(false)把绑定的类变量更新到界面中。 m_pSet->Update()将做的增删改操作更新到数据库中。 m_pSet->Requery()重新查询记录集。 推荐用ADO,比ODBC简单方便。
在C++中实现属性 本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++ 以下是译文 本文由Emad Barsoum投稿。 开发测试环境:Visual C++ 7.0, Windows XP sp1, Windows 2000 sp3 摘要 本文试着在C++中不使用任何扩展技术模拟C#(或其他语言)中的属性特征。大多数在C++实现属性的库和编译器使用扩展技术,如Managed C++或C++ Builder,或者他们使用如通常函数的set和get方法,但那不是属性。 详述 我们首先看一下什么是属性。一个属性表现为一个字段或者成员变量,但它通过read和write方法或者get和set方法暗中操作变量。 例如,若存在类A和它的属性Count,我可以写如下的代码: A foo; Cout << foo.Count; 实际上Count调用它的get函数返回当前的变量值。你可以将属性定为只读(你可以读取它但不能修改它)、只写或者可读写,这就是使用属性而不直接使用变量的的一个最大好处了。好了,让我们开始来实现它: 我们需要能做如下的事: int i = foo.Count; //--调用get函数得到值 foo.Count = i; //-- 调用set函数设定值 因此,很明显的我们需要重载 = 操作符使其能设定变量的值,同时也要重载该属性的返回值(在下面我们将会看到的)。 我们将实现一个称为property的类,它做的就像一个属性,声明如下: template class property {} 这个模板类表示的是我们的属性。Container是我们要在其中包含属性的类变量,set和get方法以及属性的类的类型。ValueType是内部变量即要定义的属性的类型,nPropType定义属性的读写标志:只读、只写或可读写。 现在我们需要一个指向从包含属性的类Container到属性类property的set和get方法的指针,同时重载 = 操作符以使得属性能象变量起那样作用。现在我们来看property类的全部定义 #define READ_ONLY 1 #define WRITE_ONLY 2 #define READ_WRITE 3 template class property { public: property() { m_cObject = NULL; Set = NULL; Get = NULL; } //-- 将m_cObject指向包含属性的container类 -- void setContainer(Container* cObject) { m_cObject = cObject; } //-- 设定可改变属性值的set成员函数 -- void setter(void (Container::*pSet)(ValueType value)) { if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE)) Set = pSet; else Set = NULL; } //-- 设定可检索属性值的get成员函数 -- void getter(ValueType (Container::*pGet)()) { if((nPropType == READ_ONLY) || (nPropType == READ_WRITE)) Get = pGet; else Get = NULL; } //-- 重载 = 号操作符使其能用set成员设定属性值-- ValueType operator =(const ValueType& value) { assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value; } //-- 使属性类能转换为内部类型成为可能-- operator ValueType() { assert(m_cObject != NULL); assert(Get != NULL);

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧