Chinaunix首页 | 论坛 | 博客
  • 博客访问: 845783
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 16:06:53

对《一个简单的学生成绩管理系统》优化的一点意见
作者:

大家好,我是第一次在上面发表东西,由于经常在VCKBASE.com看东西,而有一点心得,今天写出来和大家一起分享。
我这次是对的优化发表一点我自己的意见。
好的,现在我们开始讨论优化的问题,在讨论之前,建议先看看这篇文章。我看过《一个简单的学生成绩管理系统》后,觉他其中的show()这个函数用得不是很好。
show()函数的代码如下:
show()
{ 
        m_Set.MoveFirst();
        do
        {  
          CString s;
          s.Format("%d",m_Set.m_column1);
          m_ListCtrlx.InsertItem(i,s,0);
          m_ListCtrlx.SetItemText(i,1,m_Set.m_column2);
          s.Format("%.1f",m_Set.m_column3);
          m_ListCtrlx.SetItemText(i,2,s);
          s.Format("%.1f",m_Set.m_column4);
          m_ListCtrlx.SetItemText(i,3,s);
          s.Format("%.1f",m_Set.m_column5);
          m_ListCtrlx.SetItemText(i,4,s);
          s.Format("%.1f",m_Set.m_column6);
          m_ListCtrlx.SetItemText(i,5,s);
          s.Format("%.1f",m_Set.m_column7);
          m_ListCtrlx.SetItemText(i,6,s);
          s.Format("%.1f",m_Set.m_column8);
          m_ListCtrlx.SetItemText(i,7,s);
          s.Format("%.2f",m_Set.m_column9);
          m_ListCtrlx.SetItemText(i,8,s);
          i++;
          m_Set.MoveNext();

        }while(!m_Set.IsEOF());
        m_Set.Close();
} 
大家可以看出来,这个函数的作用是用来显示和列表控件绑定的数据库表的内容,并且这个函数在初始化的时候就调用了,这一点我觉得没有问题,问题是我觉得他在使用添加记录功能的时候会再次调用这个show()函数,我觉得这样做在效率上面会有很大的损失,为什么这么说呢?因为,每次调用show()函数以前都要清空列表中的内容,然后再把数据库表的内容又重新显示一次,这样我想在效率上面是有影响的。那我们是否可以并不要每次添加记录的时候都要show()函数呢? 有这个想法就按这个想法做下去,我仔细看过后有了新的想法,我觉得可以只要每次都显示添加的记录那不就可以了吗?而且还可以解决调用show()函数带来了抖动.

下面我就具体说说我的解决办法,其实,很简单,我们只要在添加记录的时候不要调用show()函数就可以了,而用代码直接来显示就可以了。
void CBaDialog::OnAdd() 
{
   Selec=TRUE;
   CAddialog dlg;
   if( dlg.DoModal()==IDOK)
   {  
	if(this->Select()=="一班")
	{
	   if(dlg.m_nxue>=200)
	   {
		AfxMessageBox("一班学号在1—200之间");
		return;
	   }
	}
	else
	{
	   if(dlg.m_nxue<200||dlg.m_nxue>=400)
	   {
		AfxMessageBox("二班学号在200—400之间");
		return;
	   }
	}


	m_Set.AddNew();
	m_nRecordCount+=1;
	m_Set.m_column1=dlg.m_nxue;
	m_Set.m_column2=dlg.m_strName;
	m_Set.m_column3=dlg.m_fmaths;
	m_Set.m_column4=dlg.m_fphysical;
	m_Set.m_column5=dlg.m_fchemistry;
	m_Set.m_column6=dlg.m_fenglish;
	m_Set.m_column7=dlg.m_fpolitic;
	m_Set.m_column8=dlg.m_fmaths+dlg.m_fphysical+dlg.m_fchemistry+dlg.m_fenglish+dlg.m_fpolitic;
	m_Set.m_column9=(float)(m_Set.m_column8/5);
	this->Equal();
	m_Set.Update();//Update()一定放在Equal()后
	m_Set.Requery();
	this->Xuan(); 
   }
}
我们可以不要调Xuan()这个函数,因为这个函数就是用来调用show()函数的,但是Xuan()函数中还调用了一个和show()功能一样的diaplay()函数,请读者注意,好了,我们可以添加如下代码
CString s;
s.Format("%d",m_dlg.m1);
m_ListCtrlx.InsertItem(i,s,0);
m_ListCtrlx.SetItemText(i,1,m_dlg.m2);
s.Format("%.1f",m_dlg.m3);
m_ListCtrlx.SetItemText(i,2,s);
s.Format("%.1f",m_dlg.m4);
m_ListCtrlx.SetItemText(i,3,s);
s.Format("%.1f",m_dlg.m5);
m_ListCtrlx.SetItemText(i,4,s);
s.Format("%.1f",m_dlg.m6);
m_ListCtrlx.SetItemText(i,5,s);
s.Format("%.1f",m_dlg.m7);
m_ListCtrlx.SetItemText(i,6,s);
s.Format("%.1f",m_dlg.m8);
m_ListCtrlx.SetItemText(i,7,s);
s.Format("%.2f",m_dlg.m9);
m_ListCtrlx.SetItemText(i,8,s);

细心的人一定发现了这就是show()函数中的部分代码,这确实是的,只是我将他对话框中的内容直接用列表显示出来了,其中 m_dlg.m1~m9分别是对话框中编辑框中的内容,还有一点就是要将他定义的变量 i 变成类的成员,这样就可以获得插入的准确的位置
了。这样修改后的问题就是代码会增加不少,如何取舍就看各位的需要了。
这是我对这个系统的一点不成熟的意见,希望和各位高手交流看法。更希望和刘永超联系,一起解决问题。

--------------------next---------------------

我用下列的方式访问数据库,当访问次数较多时,有下列的错误提示:客户端工作较多,驱动程序的SQLSetConnectAttr失败!
CDatabase db;
CString strSQL;
try
{
if(db.Open("Student"))
{   //pset->Close();
strSQL.Format("Select  * From BasicInfor Where num>0");
CBasicIbforSet *pset=new CBasicIbforSet;
pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);

int num=0;
num=pset->GetRecordCount();

if(num<=0)
{
return;
}
else
{
int flag=0;
while(!(pset->IsEOF()||pset->IsBOF()))
{  

//do  some work
pset->MoveNext();
}

}
pset->Close();

}

}
catch(CDBException *pe)
{
MessageBox(pe->m_strError);
if(db.IsOpen())
{
db.Close();
}
pe->Delete();
} ( lixianprince 发表于 2005-7-26 13:06:00)
 
我用下列的方式访问数据库,当访问次数较多时,有下列的错误提示:客户端工作较多,驱动程序的SQLSetConnectAttr失败!
( lixianprince 发表于 2005-7-26 13:06:00)
 
在show()函数中加一判断拉,然后分不同情况处理。
我随便说说,大家随便听听。 ( alsky 发表于 2004-4-26 14:46:00)
 
我认为用统一的显示数据函数较好! ( xiaojin 发表于 2003-4-8 13:31:00)
 
其实,我觉得从程序的整体性和可读性上来讲,使用统一的函数还是有好处的。当然同时也可以从优化性能的角度去考虑问题,但我觉得二者并不是冲突的,可以尝试着在show这个方法中进行修改,这样应该会更好! ( forevergis 发表于 2003-4-7 21:31:00)
 
.......................................................

--------------------next---------------------

阅读(236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~