我用:
   sprintf(tmpSQL, "SELECT passwd AS pd,[time] AS te FROM Account WHERE account='%s'",stNum);
    m_pConnection->Execute(tmpSQL, &RecordsAffected, adCmdText);  我想请问如何取得这个语句执行后的pd字段和te字段的值?看了一些文章,有以下两种讲法?
    (1)、RecordsAffexted返回的是执行结果的指针,我是用这个才能得到,如果是该怎么用?    (2)、还有人说用rs->GetCollect("pd")的形式,可以这么得到值,又该如何用?
还是都不是呢?请高手帮小妹解答一下疑问咯。谢谢先!

解决方案 »

  1.   

     pRst->Open(_bstr_t(sql),_variant_t((IDispatch*)pConn,true),adOpenStatic,adLockOptimistic,adCmdText);
       if(0!=pRst->GetRecordCount())
         {
       
              zsh=pRst->GetRecordCount();
    if(0==zsh%100)
    {
    zong.Format("%d",zsh/100);
    m_zong=zong;
    }
    else
    {
        zong.Format("%d",zsh/100+1);
    m_zong=zong;
    }
    sql1.Format("select 风速1,风速2,风速3,a实测 from %d where 日期='%s-%s-%s' and 时间>='%s:%s:%s' and 时间<='%s:%s:%s'order by 序号",i,getyear,getmonth,getday,text1,text2,text3,text4,text5,text6); 
    pRst1->Open(_bstr_t(sql1),_variant_t((IDispatch*)pConn,true),adOpenStatic,adLockOptimistic,adCmdText);
              if(!pRst->BOF)
    pRst->MoveFirst();
      if(!pRst1->BOF)
       pRst1->MoveFirst();
    if(zsh>=100)
       { 
       for(int i=1;i<=100;i++)
       {
       m_mschart.SetRowCount(100);
     CString strValue;
     VARIANT varValue;
     Field * field=NULL;
             VARIANT varCounter;
             varCounter.vt=VT_I4;
             varCounter.lVal=0;
     for(int j=0;j<=3;j++)
     {
               varCounter.lVal =j;
               pRst1->Fields->get_Item(varCounter,&field);
               field->get_Value(&varValue);
               strValue=VariantToCString(varValue);
       m_mschart.GetDataGrid().SetData(i, j+1,atof(strValue), 0);
     }
     for(j=0;j<=13;j++)
     {
               varCounter.lVal =j;
               pRst->Fields->get_Item(varCounter,&field);
               field->get_Value(&varValue);
               strValue=VariantToCString(varValue);
       m_fgrid.SetTextMatrix(i,j,strValue);
     }

     pRst1->MoveNext();
             pRst->MoveNext();
    }
    }
      

  2.   

    CString dialog2::VariantToCString(VARIANT var)
    {
       CString   strValue;   
      _variant_t   var_t;   
      _bstr_t   bst_t;   
      time_t   cur_time;   
      CTime   time_value;   
      COleCurrency   var_currency;   
      switch(var.vt)   
      {   
      case   VT_EMPTY:   
      strValue=_T("");   
      break;   
      case   VT_UI1:   
      strValue.Format("%d",var.bVal);   
      break;   
      case   VT_I2:   
      strValue.Format("%d",var.iVal);   
      break;   
      case   VT_I4:   
      strValue.Format("%d",var.lVal);   
      break;   
      case   VT_R4:   
      strValue.Format("%f",var.fltVal);   
      break;   
      case   VT_R8:   
      strValue.Format("%f",var.dblVal);   
      break;   
      case   VT_CY:   
      var_currency=var;   
      strValue=var_currency.Format(0);   
      break;   
      case   VT_BSTR:   
      var_t=var;   
      bst_t=var_t;   
      strValue.Format   ("%s",(const   char*)bst_t);   
      break;   
      case   VT_NULL:   
      strValue=_T("");   
      break;   
      case   VT_DATE:   
      cur_time   =   (long)var.date;   
      time_value=cur_time;   
      strValue=time_value.Format("%A,%B%d,%Y");   
      break;   
      case   VT_BOOL:   
      strValue.Format("%d",var.boolVal   );   
      break;   
      default:     
      strValue=_T("");   
      break;   
      }   
      return   strValue;   }这是将Variant转换成CString的函数
      

  3.   

    我不想用上面的moveFirst()和moveNext()方法,总觉得这种方法的效率很低,我觉得用Execute()这种方法要快些,所以才问的。  不过还是谢谢楼上的。大家各抒己见啊。
      

  4.   

    RecordsAffexted返回的是多少行受影响了。
    _variant_t vt;
    vt = rs->GetCollect("pd");
    CString str;
    if ( vt.VT != VT_NULL)
    str = (LPCTSTR)(_bstr_t)vt;
      

  5.   

    for(int j=0;j<=3;j++)
     {
               varCounter.lVal =j;
               pRst1->Fields->get_Item(varCounter,&field);
               field->get_Value(&varValue);
               strValue=VariantToCString(varValue);
     }
    这是你想要的取 值的那段程序吧,这是从我做的一个程序中摘取出来的,
      

  6.   

    To zcp126():
      你的意思就是说用rs->GetCollect("pd");虽然原来表的字段没有这个"pd"字段,用Excute()后,就可以执行了是吧。
      

  7.   

    _RecordsetPtr pRecordset;
    ......         pRecordset.CreateInstance("ADODB.Recordset");
    LPCSTR strSQL = "select * from LegalityComputeInfo";
    _variant_t var,sql=strSQL,connection=(IDispatch*)pConnection;
    try
    {
    pRecordset->Open(sql, 
    connection, 
    adOpenStatic, 
    adLockOptimistic , 
    adCmdText);
    }
    catch(_com_error & e)
    {
    AfxMessageBox(e.Description());
    }
    ......
    var=pRecordset->Fields->GetItem("IP")->Value;
      

  8.   

    用上面的recordset吧,蛮好用的
      

  9.   

    for(int j=0;j<=1;j++)
     {
               varCounter.lVal =j;
               pRst1->Fields->get_Item(varCounter,&field);
               field->get_Value(&varValue);
               strValue=VariantToCString(varValue);
     }
    当j为0时就是取你要的pd,为1时就是要取你要的te, 这与用不用movefirst和movenext没有关系啊,可能是还有别的办法吧。祝你好运!