我想实现这样的功能.
把数据库中所有满足条件的,都列出来.
代码如下:
m_pSet ->MoveFirst ();
do
{
if(m_pSet ->m_area ==2)
{
     aa=m_pSet ->m_dometic_name ;
pDC->TextOut (10,20*(b+1),aa);
b++;
}
m_pSet->MoveNext ();}while(!m_pSet->IsEOF());
如果满足条件的m_dometic_name为"张三"上面的代码输出的结果却是:
张三
张三
张三
张三
张三请教各位,这到底是怎么回事啊?

解决方案 »

  1.   

    就是说, 表中有 5 个满足 "if(m_pSet ->m_area ==2)" 这个条件的记录,
    其 m_dometic_name 值为"张三"
      

  2.   

    可你的条件是if(m_pSet ->m_area ==2)啊,不是名字值为"张三"
    啊!!!!
      

  3.   

    应该是你的判断条件用的不对吧,如果你改成if(名字==张三)然后textout出来看看,估计不会出来三个吧?
      

  4.   

    知道了, 你的 m_pSet ->m_area 是事先获取的吧? 
    这是错误的, 这个值应该在这个 do ... while 循环体内动态从数据库中读取.即:
    m_pSet ->MoveFirst ();
    do
    {
    // 这里获取当前记录的 area 值, 并赋给 m_pSet ->m_area
    if(m_pSet ->m_area ==2) // 再来判断是否为 2
    {
      ...
    }
    m_pSet->MoveNext ();}while(!m_pSet->IsEOF());
      

  5.   

    请教一下,该怎么获取当前记录的 area 值, 并赋给 m_pSet ->m_area呢?
      

  6.   

    同意一楼  从第一个符合条件的到最后一个记录一定有五个符合条件的。解决方法:在数据库中设置主键,或者查库时用distnt.
      

  7.   


    只要我多加一个表,如下
    CString Cbase::GetDefaultSQL()
    {
    return _T("[dometic_variety],[a]");}
    加入表a
    则出错
    不加表,只有一个表,则正确
      

  8.   

    > ...该怎么获取当前记录的 area 值, 并赋给 m_pSet ->m_area呢?
    ----------------------------------
    如果你的 area 在表 abc 中, 且 m_pSet 是表 abc 的 _RecordsetPtr 的结果集
    那么这样获取 area 值:
    m_pSet->m_area=atoi((LPCTSTR)(_bstr_t)m_pSet->GetCollect("area"));连起来就是:
    m_pSet ->MoveFirst ();
    do
    {
    m_pSet->m_area=atoi((LPCTSTR)(_bstr_t)m_pSet->GetCollect("area"));
    if(m_pSet ->m_area ==2) // 再来判断是否为 2
    {
      ...
    }
    m_pSet->MoveNext ();}while(!m_pSet->IsEOF());
      

  9.   

    请教sgnaw(李逍遥) ,我对数据库不是太熟悉,不好意思.
    您能不能给我说说具体的做发啊?就是m_pSet->m_area=atoi((LPCTSTR)(_bstr_t)m_pSet->GetCollect("area"));直接写进去肯定不行.它提示没有_bstr_t这个类
    我现在是建立了一个基于CRecordset的类,加入了两个表.
    我该怎么办呢?
      

  10.   

    最简单的办法:
    发源程序到 [email protected]
      

  11.   

    不过你自己可以用下面的先试试
    m_pSet ->MoveFirst ();
    CString str;
    short i=0;
    do
    {
    m_pSet->GetFieldValue(i, &str);
    m_pSet->m_area=atoi(str);
    if(m_pSet ->m_area ==2) // 再来判断是否为 2
    {
      ...
    }
    m_pSet->MoveNext ();
    i++;}while(!m_pSet->IsEOF());
      

  12.   

    sorry, 刚写错了, 算了, 我还是看邮件吧.
      

  13.   

    还没收到邮件, 请确定是发到 [email protected] 了 ?
    能否先告诉我你的表结构是什么样的? 比如含有 area 的这个表 .
      

  14.   

    我又发了一遍.
    我的表结构是这样的,dometic_id   数字
    dometic_name  文本
    dometic_knowledge  备注
    dometic_character  备注
    dometic_area   文本
    area     数字
      

  15.   

    没收到邮件, 可能邮件服务器问题, 改成下面的应该正确:
    m_pSet->MoveFirst();
    do
    {
    CString str;
    m_pSet->GetFieldValue(5, &str); // 获取 area
    int area = atoi(str);
    if(area == 2) // 再来判断是否为 2
    {
    str = "";
    m_pSet->GetFieldValue(1, &str); // 获取 dometic_name
    pDC->TextOut(10,20*(b+1), str);
    b++;
    }
    m_pSet->MoveNext();
    }while(!m_pSet->IsEOF());
      

  16.   

    编译后,出现了问题,如下:
    E:\text\textView.cpp(69) : error C2664: 'void __thiscall CRecordset::GetFieldValue(const char *,class CDBVariant &,short)' : cannot convert parameter 1 from 'const int' to 'const char *'
            Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    E:\text\textView.cpp(74) : error C2664: 'void __thiscall CRecordset::GetFieldValue(const char *,class CDBVariant &,short)' : cannot convert parameter 1 from 'const int' to 'const char *'
            Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    Error executing cl.exe.请问,查询还有别的方法吗?或者函数吗?
      

  17.   

    好象你用的 VC++ 不是 VC6/2003/2005 , 不过没关系, 按照提示, 改成 const char * 即可:
    m_pSet->MoveFirst();
    do
    {
    CString str;
    m_pSet->GetFieldValue("area", &str);
    int area = atoi(str);
    if(area == 2)
    {
    str = "";
    m_pSet->GetFieldValue("dometic_name", &str);
    pDC->TextOut(10,20*(b+1), str);
    b++;
    }
    m_pSet->MoveNext();
    }while(!m_pSet->IsEOF());
      

  18.   

    兄弟要这样:m_pSet ->MoveFirst ();
    do
    {
    // 这里获取当前记录的 area 值, 并赋给 m_pSet ->m_area
    if(m_pSet ->m_area ==2) // 再来判断是否为 2
    {
      ...
    }
    m_pSet->MoveNext ();}while(!m_pSet->IsEOF());
      

  19.   

    m_pSet是什么东西?ado的recordset好像不是这样调用的啊?如果是你自己包装的类,那就是你的类的问题了。
      

  20.   

    我根据建议,改成了这样的
    m_a ->MoveFirst ();
    do
    {
    CString *str;
    CString *strr;
    CDBVariant   varValue;
    m_a->GetFieldValue("area", varValue); // 获取 area
        strr=varValue.m_pstring ;
    int area = atoi(*strr);
    if(area == 2) // 再来判断是否为 2
    {
    m_a->GetFieldValue("dometic_name", varValue); // 获取 dometic_name
    str=varValue.m_pstring ;
    pDC->TextOut(10,20*(b+1), *str);
    b++;
    }
    m_a->MoveNext ();}while(!m_a->IsEOF());
    可是怎么还不行啊,没有错误了,但是程序视图中没有任何显示