none
GetFieldValue使用的问题,那位可以帮忙解决一下? RRS feed

  • 问题

  • 我使用vc++ 2005 和access 2003编写了数据库访问的内容,现在遇到GetFieldValue出错的问题。

    数据库结构

    表 option{

    id  数字,

    content 备注,

    代码

     

     

    CDBVariant variant;

     CString * p = 0;

      CString strcon( _T("ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};UID=;PWD=;DBQ=exam.mdb"));

     CDatabase db;

       if(!db.Open(NULL, FALSE, FALSE, strcon))

       {

           MessageBox(_T("Error 1")); 

           return ;

       }

     

       CString sqlstring;

       sqlstring.Format(_T("select * from [option] where question_ID = 262;"));

     

       CRecordset rs(&db);

      rs.Open(AFX_DB_USE_DEFAULT_TYPE, sqlstring);

        if(rs.IsOpen())

        {

            if (!rs.IsEOF())

            {

                try{

                variant.Clear();

                rs.GetFieldValue(_T("content"), variant);///会出错,但是在调试时内存看没有问题

     

                p = variant.m_pstring;   

     

                CString tmp = * variant.m_pstring;

                }

                catch(...)

                {         

                    MessageBox(_T("sssss"));

                }

            }

        }

        else

        {

            MessageBox(_T("Error: file can not open"));

        }   

        db.Close();

     

     

    当content 值为数字时就会有问题 如:1 或 2的

    以上代码会在rs.GetFieldValue出现问题,我看了一下就是在GetFieldValue中出现异常了,但是究竟为什么搞不懂,那位高手也曾遇到过,或者可以帮忙定位一下

    2011年1月25日 13:21

答案

  • virtual void GetFieldValue(
       int nIndex,
       COleVariant& varValue )

    GetFieldValue的第一个参数是int 类型的,第二个参数是取出的值

    给你个例子

    while(!rs1.IsEOF())//如果没有结束
     {
      // int index = 1;
      int row, col;
      row = 0;
      col = 0;

      GV_ITEM item;
      item.mask = GVIF_TEXT | GVIF_FORMAT | DT_RIGHT;
      
      for(int r = 0; r<m_ColCount; r++)
      {   
       for(int c = 0; c<m_RowCount; c++)
       { 
        item.nFormat = DT_LEFT | GVIF_FORMAT | DT_WORDBREAK;
        item.row = r;  
        item.col = c;
        
        CString str;
        rs1.GetFieldValue(c, str);
        
        if(c == 0)//如果是第0列,输出列的序号
        {
         int n;
         n = r;
         CString m;
         m.Format(_T("%d"), n+1);
         m_GridCtrl->SetItemText(r+1, 0, m);//输出的位置
        }
        m_GridCtrl->SetItemText(r+1, c+1, str);//输出
       }
       rs1.MoveNext(); 
      }
      m_GridCtrl->SetItem(&item);
     }


    xiao
    2011年3月17日 9:23

全部回复

  • 你没有转换类型吧?数据库字段是什么类型的?估计是类型的错误!


    To Be An Excellent Coder!
    2011年1月26日 7:19
  • virtual void GetFieldValue(
       int nIndex,
       COleVariant& varValue )

    GetFieldValue的第一个参数是int 类型的,第二个参数是取出的值

    给你个例子

    while(!rs1.IsEOF())//如果没有结束
     {
      // int index = 1;
      int row, col;
      row = 0;
      col = 0;

      GV_ITEM item;
      item.mask = GVIF_TEXT | GVIF_FORMAT | DT_RIGHT;
      
      for(int r = 0; r<m_ColCount; r++)
      {   
       for(int c = 0; c<m_RowCount; c++)
       { 
        item.nFormat = DT_LEFT | GVIF_FORMAT | DT_WORDBREAK;
        item.row = r;  
        item.col = c;
        
        CString str;
        rs1.GetFieldValue(c, str);
        
        if(c == 0)//如果是第0列,输出列的序号
        {
         int n;
         n = r;
         CString m;
         m.Format(_T("%d"), n+1);
         m_GridCtrl->SetItemText(r+1, 0, m);//输出的位置
        }
        m_GridCtrl->SetItemText(r+1, c+1, str);//输出
       }
       rs1.MoveNext(); 
      }
      m_GridCtrl->SetItem(&item);
     }


    xiao
    2011年3月17日 9:23
  • rs.GetFieldValue((short)0, variant));
    xiao
    2011年3月18日 8:03