vc/mfc 项目 + Sql Server2000 开发数据库项目现有这样两个表:合同表 A, 合同明细表B。结构如下:A:                           B:
ContractID  VarChar 50       ContractID  VarChar  50 
Company     VarChar 100      DetailID    VarChar  50
……                         TheFee       float    8
                             Currency     VarChar 10现在小弟要实现这样的功能:
查询每个合同的合同明细金额之和,要求返回合同号,公司名称,合同明细金额之和(按币值分开)我写了一个Sql语句来实现该功能:
Select a.ContractID, a.Company, Sum(b.TheFee) from A LEFT JOIN B ON a.ContractID = b.ContractID Group By ContractID, Currency小弟遇到的问题是:
上述Sql语句通过db.Execute()来执行后。在不借助其他表的情况下:对于执行的结果,在vc/mfc中,如何使用ODBC逐条访问。请高手指点……学习,关注……

解决方案 »

  1.   

    用odbc的api SQLGetData可以得到数据集 用vc来做数据库编程很不方便哦,还有感觉你的sql语句好想不对,如果在orcal里肯定是错的 应该group by a.contractID, a.Company
      

  2.   

    sprintf((char*)select,"select……");
    rc = SQLExecDirect(hstmt, select, SQL_NTS);
    if ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
    {
       SQLBindCol(hstmt,1,SQL_C_LONG,&collectid,0,&cbcollectid);
       SQLBindCol(hstmt,2,SQL_C_LONG,&offset,0,&cbeoffset);
       while(TRUE)
       {
         rc=SQLFetch(hstmt);   //取查询结果,并把指针指下一条记录
         if ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
         {

    ……
         }
         else       
            break;
        }
      SQLCloseCursor(hstmt);
    }
      

  3.   

    直接使用ODBCAPI函数来写,非常简单,网上有好多例子,可以找一下
      

  4.   

    // 创建进行存取的字符串
    sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
    TRY
    {
            // 打开数据库
            CDatabase database;
            database.Open(NULL, false, false, sDsn);        
            CRecordset recset(&database);
            // 设置读取的查询语句.
            sSql = "SELECT *  FROM demo";    
            // 执行查询语句
            recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
            // 获取查询结果
            while (!recset.IsEOF())
            {
                //读取数值
                recset.GetFieldValue("Name ", sItem1);
                recset.GetFieldValue("Age", sItem2);
                // 移到下一行
                recset.MoveNext();
            }
            // 关闭数据库
            database.Close();                             
    }
    CATCH(CDBException, e)
    {
            // 数据库操作产生异常时...
            AfxMessageBox("数据库错误: " + e->m_strError);
    }
    END_CATCH;
      

  5.   

    楼上正解阿,这个其实应该不难得。
    只要有一个结果集和拼接好的sql字符串,剩下的就是体力活了
      

  6.   

    to : laiyiling(※陌生人·坚持理想※) 在使用你给我的方法的时候,出现一个问题:
    recset.GetFieldValue("Age", sItem1);
    如果字段使用的是int或者float类型的话,那么sItem1就没有办法取得该字段的值,请问要怎么解决啊?请指点一下,谢谢!学习……
      

  7.   

    我的例子得到是CDBVariant 类型
    CString m_sVal;
    long m_lData;
    CDBVariant m_dbVarVal;
    m_pRecordset->GetFieldValue("mailSender",m_sVal);
    m_pRecordset->GetFieldValue("mailDate",m_dbVarVal);
    m_lData=m_dbVarVal.m_lVal;
    char pTmp[32];
    _ltoa(m_lData,pTmp,10);
      

  8.   

    char pTmp[32];
    _ltoa(m_lData,pTmp,10);
    这两句要删除
    m_lData已经是long型。
      

  9.   

    至于如何读取每条记录中的各个数据,在你的sql语句里控制,然后用
    SQLBindCol将查询值绑定到变量中,进行读取!
    你可以查看这SQLBindCol、SQLExecDirect、SQLFetch几个函数的用法