调了一晚上程序,终于找出问题的所在,记下,以提醒自己,编程需要细心!
最近一直在为一个管理系统忙的焦头烂额,眼看着主要功能要实现了,然而不走运的一刻开始了。当我将数据添加完毕,在查询的记录时,在ListCtrl中显示的前一次结果总会被当前的结果所取代。
//
// 连接数据库
//
CDB db;
_RecordsetPtr Rs;
CString strSql;
CString strTemp;
strSql = "SELECT i_id, i_time, i_ip, i_domain, i_port, i_hosttype, i_nation, i_status ";
strSql += "FROM info ORDER BY i_id DESC";
//
// 执行sql语句
//
Rs = db.Exec(strSql);
for(int nItem = 0; !Rs->adoEOF; nItem++)
{
strTemp.Format("%d", Rs->GetCollect("i_id").intVal);
m_List.InsertItem(nItem, strTemp);
m_List.SetItemText(nItem, 1,
IS_VT_NULL(Rs->GetCollect("i_ip").vt) ? "" : (char*)((_bstr_t)Rs->GetCollect("i_ip")));
m_List.SetItemText(nItem, 2,
IS_VT_NULL(Rs->GetCollect("i_domain").vt) ? "" : (char*)((_bstr_t)Rs->GetCollect("i_domain")));
m_List.SetItemText(nItem, 3,
IS_VT_NULL(Rs->GetCollect("i_port").vt) ? "" : (char*)((_bstr_t)Rs->GetCollect("i_port")));
m_List.SetItemText(nItem, 4,
IS_VT_NULL(Rs->GetCollect("i_hosttype").vt) ? "" : (char*)((_bstr_t)Rs->GetCollect("i_hosttype")));
m_List.SetItemText(nItem, 5,
IS_VT_NULL(Rs->GetCollect("i_nation").vt) ? "" : (char*)((_bstr_t)Rs->GetCollect("i_nation")));
strTemp.Empty();
strTemp.Format("%s", Rs->GetCollect("i_status").bVal > 0 ? "可用" : "失效");
m_List.SetItemText(nItem, 6, strTemp);
strTemp.Empty();
m_List.SetItemText(nItem, 7, (char*)((_bstr_t)Rs->GetCollect("i_time")));
Rs->MoveNext();
}
Rs->Close();
db.Close();
第一反应,将ORDER BY ... DESC修改为ASC,程序能正常显示结果了。但是这不符合我的输出要求啊,通过一阵子DEBUG,发现,无论怎样的改代码,程序总以升序的方式输出。难道win2k3下的ListCtrl默认都以升序的排列输出?如果时这样的话,让这段代码工作也不难,只要将InsertItem和SetItemText中的nItem参数设置为0即可,不过这样对于数据库的操作就变的更为死板(vc对数据库的操作已经够让我头痛的了),还要判断sql中的排序方法。调了半天也没想明白其中的原因,总不能让我在自己实现一个ListCtrl吧。
还是不死心,如果功能是控件实现的话,那一定是通过设置控件属性来实现的。再打开窗口,找到那个ListCtrl,发现在Style标签中,sort属性选择的是Ascending,faint,这东西默认我记得是none,改成none,OK!问题解决了。
这本来是一个很简单的问题,看来编程还是要细心一些,省得总在一些小的地方绊倒。