写了个类,在dll中, 这个类中有个查询数据库的函数,查询数据后,把结果存储在vector中,供其他程序调用,也就是说,我在写dll的时候压根就不知道字段有几个,表是什么,
都是由外界传参数。代码如下:int i;    vector<_RecordPtr> result;  还是vector<_bstr_t>result;    //保存每条记录                  m_pRes.CreateInstance(_uuidof(Recordset)); m_pRes->Open(_bstr_t(sql),m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);

//存储字段名字   
for(i=0;i<m_pRes->Fields->GetCount();i++)
{
column_name.push_back(m_pRes->Fields->GetItem( (_bstr_t)i )->Name );   //获取列名(即字段名)
} //存储每一条记录接下来的代码如何写? 可以获取字段名吗?
 我不知道该如何存储记录?帮忙解决一下。有个疑问:  我定义一个vector来保存每条记录,是不是有问题,或者说:操作性不强,该改成来保存每条记录中的一个字段值。可是这样一来,我不并不知道有多少列名,字段,我就不能为每一列定义个vector了

解决方案 »

  1.   

    使用 CODBCFieldInfo 
    CRecordset Rs1(conn);                  //记录集,conn为CDatabase,已经打开的连接
    Rs1.Open(2,L"select * from table",4);  //打开表
    int iCount=Rs1.GetODBCFieldCount();    //获得字段总数
    CStringArray fldName;                  //字符串数组,用来保存字段
    CODBCFieldInfo fInfo;                  //CODBCFieldInfo 结构,字段信息
    for(int i=0;i<iCount;i++){
    Rs1.GetODBCFieldInfo(i,fInfo);
                    fldName.Add(fInfo.m_strName);  //获得字段名
    }
    Rs1.Close();
      

  2.   

    我sb了,表述严重错误。。抱歉啊,我的意思是:我要求获取整条记录值, 而不是字段,,举例:id  name  sex1  战三   男2   莉莉  女我要获取整条记录“ 1 张三 男”然后保存在vector中,供其他人用,他用的时候将 整条记录解析出来。
      

  3.   

    参看第三楼, 第一楼作废 如何获取整条记录???   var = m_pRecordset->GetCollect("ID");  
    这个只是获取一条记录中的一个字段值, 我要整条记录
      

  4.   

    std::vector<std::vector<CString> > CDB::SelectCMD(CString SQL)
    {
    std::vector<std::vector<CString> > table;
    if(SUCCEEDED(::CoInitialize(NULL)))
    {
    if(1)
    {
    _ConnectionPtr PConn;
    HRESULT   hr;
     hr   =   PConn.CreateInstance(_T("ADODB.Connection"));  if(SUCCEEDED(hr))
     {
    try
    {
    _RecordsetPtr PRs(_T("ADODB.Recordset"));
    PConn->Open((_bstr_t)LocalConnStr,_T(""),_T(""),adModeUnknown);

      _variant_t RecordsAffected;
    _variant_t str_val;
    PRs=PConn->Execute((_bstr_t)SQL,&RecordsAffected,adCmdText);
    while(!PRs->adoEOF)
    {
    std::vector<CString> rs;
    int cols=PRs->GetFields()->Count;
    for(int i=0;i<cols;i++)
    {
    CString val;
    str_val = PRs->GetCollect(long(i));
     switch(str_val.vt)
     {
     case VT_NULL:
     val=_T("");
     break;
     case VT_DATE:
     SYSTEMTIME systime;
     VariantTimeToSystemTime(str_val.date,&systime);
     val.Format(_T("%02d-%02d-%02d %02d:%02d:%02d"),systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond);
     break;
     default:
     val= CString((char *)(_bstr_t)str_val);
     break;
     }
    /* if   (str_val.vt   ==   VT_NULL)
     val=_T("");
     else
     val= CString((char *)(_bstr_t)str_val);*/
    rs.push_back(val);
    }
    table.push_back(rs);
    PRs->MoveNext();
    } PRs->Close();
    /* PRs.Release();
    PRs=NULL; */
    }
    catch(_com_error e)  //异常
    {
    CString Data;
    Data.Format(_T("connect database error; %s\n"),(char *)e.ErrorMessage());
    }
    //PConn->Close();
    /* PConn.Release();
    PConn=NULL;*/
     }
    }
    ::CoUninitialize();
    }
    return table;
    }
      

  5.   

    获得字段名,获取字段值就简单了吧,    for(int i=0;i<iCount;i++){
            Rs1.GetODBCFieldInfo(i,fInfo);
            CString strValue;                             //字段值
    Rs1.GetFieldValue(strValue,fInfo.m_strName);  //fInfo.m_strName为字段名
            fldName.Add(strValue);                        //获得字段名
        }
    但你封装到 动态库里面,返回 vector 类型不合适吧,其他语言如何调用?
    最好返回 XML 格式化的字符串。
      

  6.   

    xml不懂 ,我现在的问题,是不管事什么格式, 必须返回存储整条记录,而且如何根据整条记录解析出 各字段值来这是问题所在,  大家帮忙,看有没有办法。
    实在不行,有没有替代的方法,,我不可能为每列定义个vector啊?我也不知道有多少列?
    对吧所以我才想将整条记录给存储, 然后将vector设置成public ,然然后对话框类去访问它。不要说:为什么不在对话框类中写这个函数, 要求是这样的 ,数据库操作作为一个dll
      

  7.   

    上面代码就已经获得所有字段值了啊。至于如何返回,一般用格式化字符串。
    比如
    <id>001</id>
    <name>张三</name>
    <age>19岁</age>DLL里面再写一个解析函数。   CDatabase *conn;
       conn->OpenEx("连接串")
       CRecordset Rs1(conn);                  //记录集,conn为CDatabase,已经打开的连接
        Rs1.Open(2,L"select * from table",4);  //打开表
        int iCount=Rs1.GetODBCFieldCount();    //获得字段总数
        CStringArray fldName;                  //字符串数组,用来保存字段
        CStringArray fldValue;                  //字符串数组,用来保存字值
        CODBCFieldInfo fInfo;                  //CODBCFieldInfo 结构,字段信息
        for(int i=0;i<iCount;i++){             //循环获得所有字段值
            Rs1.GetODBCFieldInfo(i,fInfo);
            fldName.Add(fInfo.m_strName);     //获得字段名
             CString fldValue; 
            Rs1.GetFieldValue(strValue,fInfo.m_strName); //获得字段值
             fldValue.Add(strValue);           //字段值加到数组
        }
        Rs1.Close();
      

  8.   

    兄台在吗,  switch(str_val.vt)中的vt是什么意思?另外,我如何反解析呢,