我的查询结果要从两张表中关联查询后得到,可是生成结果集m_Set只能对应一张表,我如何才能得到包含两张表信息的查询结果集呢?例如要实现如下要求:
 CString SqlStr=“select table1.name,table1.id,table2.tele from table1,table2 where table1.id=table2.id”
 m_Set.Open(AFX_DB_USE_DEFAULT_TYPE,SqlStr);//这样这个结果集就不行了,    table1和table2的结构不一样请求解决方法,谢谢!

解决方案 »

  1.   

    有一种方法,建立CRecordSet的时候选择两个表,这样就可以这样操作了。但是坏处是只能用sql语句,不能用CRecordSet的.update之类的函数了。
    或者你依次打开两个表,这么写:
    CFirstSet firstform;
    CSecondSet Secondform;
    Firstform.open(......."firstformname");
    Secondform.open(..."secondformname");
      while(!firstform.IsEof()&&!Secondform.IsEof())
     {
         if(firstform.id==secondform.id)
            ......
            firstform.movenext;
            secondform.movenext;
    缺点有点麻烦
      

  2.   

    建立CRecordSet的时候选择两个表,这个方法好像有欠灵活,很多查询是在程序运行时才临时需要的,用这个方法就需要在程序设计阶段就想好CRecordSet怎么建,似乎不妥,第二个方法是实在没招了才用的,不过还是谢谢你的提供的方法,欢迎继续参与。
      

  3.   

    我一般使用第一种方法(做证券行业的应用),这就需要你在设计数据库时多费点心。对数据的更新我SQL语句用的更多一点而不是用Recordset的方法。
      

  4.   

    那你可以这样,再建个CRecordSet 专门用于多表查询。就是说比如有两个表,建立三个CRecordSet,多表查询用最后一个,更新用第一二个。这样不就解决了不灵活的毛病?
      

  5.   

    我所指的不灵活是说要在程序设计阶段就要想好哪些表可能需要关联查询,那我就必需要建立相映的CRecordSet类,这样很不灵活,我的程序会变得行臃肿的,是吧。
      

  6.   

    难道不是在程序设计阶段就想好CRecordSet怎么建吗?那要系统分析干嘛?
      

  7.   

    我不知道这第一种方法(建立CRecordSet的时候选择两个表)是不是就是用VC编写数据库程序解决此类问题的通常做法啊?
      

  8.   

    老大,你还是没明白我说的意思。把所有的表全放到最后一个CRecordSet。你不是想用什么就用了?严重同意楼上。
      

  9.   

    错了,同意的是8楼.
    无论是不是vc,所有编程语言处理这个不外乎两种方法:套用sql,或者用自己的函数。你还能想出新鲜的么?
      

  10.   

    void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType 
    = DEFAULT_FIELD_TYPE );
    throw( CDBException, CMemoryException );void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = 
    DEFAULT_FIELD_TYPE );
    throw( CDBException, CMemoryException );void GetFieldValue( LPCTSTR lpszName, CString& strValue );
    throw( CDBException, CMemoryException );void GetFieldValue( short nIndex, CString& strValue );
    throw( CDBException, CMemoryException );select table1.field1 as A1, table2.field1 as B1 ...CRecordset::GetFieldValue("A1",...)
    CRecordset::GetFieldValue("B1",...)
      

  11.   

    我明白你的意思,不过我不知道这样会不会影响查询的效率,毕竟这样就使得m_Set很庞大了,查询有可能很费时吧?
      

  12.   

    masterz(MS MVP):什么意思啊,请解释一下
      

  13.   

    GetFieldValue允许动态取一个列中的数据。因为运行时可能不知道列的数据类型,GetFieldValue使用一个CDBVariant对象来存储列的数据。
      

  14.   

    利用GetFieldValue和SetFieldValue,也可以不用DFX机制而实现对数据库列的动态绑定。
      

  15.   

    runner111(runner111):m_Set变庞大了,查询会不会费时?
      

  16.   

    不会吧?CRecordSet 实际上是个游标类型的东西。你可以试试看,应该不会费太多时间的
      

  17.   

    还有一个问题,我的程序运行查询时提示ODBC驱动程序不支持动态记录集,可能的原因有哪些?
    这时的记录集是用第一种方式(建立CRecordSet的时候选择两个表)建立的,并且建立时选择了动态集方式。
    但如果是建立时选择一个表,即使是选择了动态集方式也不会提示说“ODBC驱动程序不支持动态记录集”,为什么啊?
      

  18.   

    你用的是不是 dynameic? 这个大多数都不支持的
      

  19.   

    上面的问题提的有错误
    现只提问:
    还有一个问题,我的程序运行查询时提示ODBC驱动程序不支持动态记录集,可能的原因有哪些?
      

  20.   

    我用的是SQL Sever不知道是不是支持dynameic
      

  21.   

    我用的是ODBC访问SQL Sever数据库,不知道是不是支持dynameic
      

  22.   

    我刚说完,你不要用dynameic 用别的。
      

  23.   

    那就是snapshot,可我的数据库要同时被多个客户访问,snapshot就不怎么实时了。
    还有
    CString SqlStr;SqlStr = "select table1.namestr,table1.age,table1.num from table1,table2 where table1.namestr=table2.namestr";
        
    m_TSet.Open(AFX_DB_USE_DEFAULT_TYPE,SqlStr);为什么提示“无效的描述器索引”?
      

  24.   

    我改用CRecordset::forwardOnly,就好了,同样的SQL语句,真不明白
      

  25.   

    好像如果是多表单RecordSet的话,是不能用AFX_DB_USE_DEFAULT_TYPE这个的。你用CRecordSet::snapshot就好了。还有用snapshot没有关系的
      

  26.   

    runner111(runner111) :谢谢你的热心帮助,你以前用vc做过什么数据库应用程序,可以留下你的email吗,以后还想向你请教。我的email是[email protected]
      

  27.   

    请教不敢当,我也就是这几个月用过一些,互相促进吧。[email protected]
      

  28.   

    最后还想问一下,用snapshot时,如果要让别的客户端看到我所做的修改,是不是要在添加,删除,修改等操作之后调用requery()就行啦?