if (str=="总分排名")
{
CString StrText="专业";
SetDlgItemText(IDC_STATIC, StrText);
CString Sqlstr;
CString StrCourseCB;
int index = m_CourseCB.GetCurSel();
m_CourseCB.GetLBText(index,StrCourseCB);
StrCourseCB.TrimRight();
//Sqlstr.Format("SELECT XH,XM,PJCJ=CAST(sum(CJ*XF)/sum(XF) as numeric(18,4)) FROM XS_KC_CJ where ZY ='%s' GROUP BY XH,XM ORDER BY PJCJ DESC",StrCourseCB);
Sqlstr="select XH,XM,CAST(sum(CJ*XF)/sum(XF) as numeric(18,4)) as PJCJ from XS_KC_CJ where ZY='计算机' group by XH,XM order by PJCJ desc";

//Sqlstr="Select XH,XM,XB from XS";
//打开ADO连接

CDlgLogin::OpenADO();
m_pCom->CommandText=bstr_t(Sqlstr);
m_pRs->Open((_variant_t)Sqlstr,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
//rst->Open(Sqlstr,adCmdText);

int i=0; //清空列标题
int iCount = m_PrintGrid.GetHeaderCtrl()->GetItemCount();  
for(i = 0; i < iCount; i++)
{  
m_PrintGrid.DeleteColumn(0);  
}  
m_PrintGrid.DeleteAllItems(); //清空原显示的记录 // 加入列标题

CString sHeadText[7]={"名次","学号","姓名","平均学分积"};
int nWidth[4]={40,120,80,120,};
//m_PrintGrid.ReadOnly(true);
for(i=0;i<4;i++)
{
m_PrintGrid.InsertColumn(i,sHeadText[i]);
m_PrintGrid.SetColumnWidth(i,nWidth[i]);
}
for(i=0;i<m_pRs->GetRecordCount();i++)
{
m_PrintGrid.InsertItem(i,""); //加入默认行
} CString sName;
m_pRs->MoveFirst();
for(i=0;i<m_pRs->GetRecordCount();i++)
{
m_pRs->Move(i); //移动记录集指针到位置i
for(int c=0;c<m_pRs->Fields->Count+1;c++)
{
if(c==0) //第一列是名次
{
sName.Format("%d",i+1);
m_PrintGrid.SetItemText(i,c,sName); //填入名次
continue;
}
sName=(char*)(_bstr_t)(m_pRs->Fields->GetItem((long)(c-1))->Value);
m_PrintGrid.SetItemText(i,c,sName);
}
m_pRs->MoveFirst(); //防止错误
}
}红色部分的SQL语句在SQL查询分析器中执行正常,到了这里就返回空(m_pRs->GetRecordCount()返回-1)
换蓝色简单的语句就行!!奇怪!!

解决方案 »

  1.   

    使用GetRecordCount获得记录集记录数,必须使用ADO的客户端游标,在你打开数据库连接前调用如下语句:
    m_pConn->CursorLocation = adUseClient;
      

  2.   

    我晕,那换别的SQL语句怎么就不用加这么一句也行呢?
    比如Sqlstr="Select XH,XM,XB from XS";
    而这个SQL语句
    Sqlstr.Format("SELECT XH,XM,PJCJ=CAST(sum(CJ*XF)/sum(XF) as numeric(18,4)) FROM XS_KC_CJ where ZY ='%s' GROUP BY XH,XM ORDER BY PJCJ DESC",StrCourseCB);
    就非要加上?
    怎么解释?
      

  3.   

    m_pRs->GetRecordCount()要返回记录数,要求
    1、pRs->CursorLocation = ADO::adUseClient //客户端游标
    2、游标类型不能为只向前游标。动态、静态、键集都可以。
      

  4.   

    那你调试一下,取得Sqlstr变量中的值在SQLSERVER的查询分析器中执行看看能不能返回数据?
      

  5.   

    我执行了,SQL语句都是可以的!长的那条一定要加上客户端游标!短的加不加都行!
      

  6.   

    确定是语句导致的 尽管语句查询正常 这个语句是我问来的
    这里有数据库的视图和表

    http://topic.csdn.net/u/20080909/14/dfc565ae-71ca-4c02-9897-64b97a0e2379.html