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

                                                                         朱金灿
 
晚上一位朋友问我有关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这一项,这显然是不符合逻辑嘛。
 
     我觉得,在现在很多库层层封装之下,学会理解被封装的程序的内在逻辑对开发人员尤为重要。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值