编程要准确理解程序里面的逻辑

                                                                         朱金灿
 
晚上一位朋友问我有关ado访问数据库的问题。说实话我已经有相当一段时间没有做数据库了,感觉把知识忘得差不多了。
 
朋友的程序是这样的:
int CGMSDlg::LoginCheck(CString strID, CString strPwd)
{
    if( m_adoConnection.Open("GMS.mdb")==FALSE )
    {
        return LINK_FAILURE;
    }
 
    m_adoRecordset.SetAdoConnection(&m_adoConnection);
    m_adoRecordset.PutCursorLocation(adUseClient);
    if( m_adoRecordset.Open("users", adCmdTable)==FALSE )
    {
        return LINK_FAILURE;
    }
   
    if( m_adoConnection.BeginTrans()==BEGINTRANS_FAILURE )
    { 
        return LINK_FAILURE;
    }
 
    //// 查找用户名
    m_strFind.Format("SELECT pwd FROM users WHERE id=/"%s/"",strID);
    if ( m_adoRecordset.Find(m_strFind)==FALSE )
    {
        return WRONG_ID;
    }
 
    //// 若找到,取出用户密码,和登录密码进行比较
    if( m_adoRecordset.GetCollect("pwd", m_varValue)==FALSE
       || strcmp(strPwd, (_bstr_t)m_varValue)!=0 )
    {
        return WRONG_PWD;
    }
 
    m_strUserName = m_adoRecordset.GetCollect("name",m_varValue);
    m_strUserName = (LPCSTR)(_bstr_t)m_varValue;
    return CHECK_PASS;
}
 
     这里的m_adoConnection是ado中的_ConnectionPtr一个封装类的实例,m_adoRecordset是_RecordsetPtr一个封装类的实例(我个人感觉没必要对ado进行封装)。
 
      我觉得朋友没有准确理解程序的逻辑。比如m_adoRecordset.Find函数(其实是封装_RecordsetPtr的Find函数),它的参数放的就不是sql语句,而是查询条件。更为关键的问题是他没有理解ado的内在逻辑。其实我们看到对某个记录取字段值,都是基于查询结果集的。那么下面一段代码:
m_strFind.Format("SELECT pwd FROM users WHERE id=/"%s/"",strID);
    if ( m_adoRecordset.Find(m_strFind)==FALSE )
    {
        return WRONG_ID;
    }
看似是比较ID,但实际上执行sql语句的结果记录集却没有id这一项,这显然是不符合逻辑嘛。
 
     我觉得,在现在很多库层层封装之下,学会理解被封装的程序的内在逻辑对开发人员尤为重要。
 

posted on 2008-03-11 22:51  岚之山  阅读(229)  评论(0编辑  收藏  举报

导航