问题:
    有3个表,A,B,C  主键分别为aId, bId, cId;同时 aId为表B的外键,bId为表C的外键,假设表A中有5W条记录,表B,C中有任意条记录(我在测试时B,C表均为空)。    我想要从数据库中读取所有表A,B,C中的数据,保存到内存中,我定义了一个容器A(可看作是表A的结构体数组),就是结构体数组A中的每一个结构体中存表A的所有字段以及表B的结构体数组,结构体B中存表B的所有字段及表C的结构体数 组,结构体C中存表C的所有字段。(就是说结构A与B是一对多的关系,通过aId来存;结构B与C也是一对多关系,通过bId来存)
    我用的C++(VS2005),ODBC连接数据库,数据库用的MS-SQLSERVER2005    其实我要问的和上边关系不大就是描述下逻辑
    代码流程如下:
    查找表A,并取出表A中全部aId(SQL语句1)
    for循环遍历aId
        根据aId查找表B中匹配aId的所有记录,并取出满足条件的bId(SQL语句2)
            for循环遍历bId
                根据bId查找表C中匹配bId的所有记录(SQL语句3)
                将SQL语句3的结果保存到C的结构体数组中
            将SQL语句2的结果保存到B的结构体数组中
        将SQL语句1的结果保存到A的结构体数组中
        打印结构体数组A的长度(size)
    
    如果正常运行则会打印从1到50000这50000个数,并将表中信息全部存入结构体数组。
    但是我在运行时,每次打印到几百条就失败了,都是在执行SQL语句时出错,可能是SQL语句2,也可能是SQL语句3,两种情况都有,打印出了错误信息,只有2种
                 1:SSL安全错误。
                 2:不存在或访问被拒绝。
         注:循环执行的语句没有变化,只是匹配的ID不同,而且我把中断的语句提出来在数据库中运行时没有问题的。    两条语句都可能出现以上这两种情况,开始我以为是由于短时间内执行大量SQL语句造成的,于是我每次循环都SLEEP(50),结构还是同样的错误;我又尝试了每循环100次就断开一下数据库再重连,还是出现同样问题。    问了好多人都不知道什么原因,请教高手来解决此问题,100分,谢谢大家了

解决方案 »

  1.   

    最好给出完整的表结构,测试数据,计算方法和正确结果.发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  2.   

    贴是贴不上来了,举例吧
    表结构如下:
    表A  aId  aName aType    aId为主键
          1    aa1    1
          2    aa2    1
          ...
        50000 aa50000 1表B  aId    bId   bName   bType       bId为主键,aId为外键
          空表C  bId    cId   cName   cType       cId为主键,bId为外键
          空内存结构如下:
    struct cc
    {
        int cId;
        string cName;
        int cType;
    };struct bb
    {
        int bId;
        string bName;
        int bType;
        vector<cc> cList;
    };struct aa
    {
        int aId;
        string aName;
        int aType;
        vector<bb> bList;
    };typedef vector<aa> aList;代码如下(判断及声明省略了,FetchAll()为将SQL语句结构去出来存入结果集record的函数):
    FetchAll("select aId,aName,aType from A", recordA);
    for(int i = 0; i < recordA.size(); i++)
    {
        aa.aId = recordA[i][0];
        aa.aName = recordA[i][1];
        aa.aType = recordA[i][2];
        FetchAll("select bId,bName,bType from B where aId = " + recordA[i][0], recordB);
         for(int j = 0; j < recordB.size(); j++)
        {
            bb.bId = recordB[j][0];
            bb.bName = recordB[j][1];
            bb.bType = recordB[j][2];
            FetchAll("select cId,cName,cType from C where cId = " + recordB[i][0], recordC);
             for(int l = 0; l < recordC.size(); l++)
            {
                cc.cId = recordC[l][0];
                cc.cName = recordC[l][1];
                cc.cType = recordC[l][2];
                bb.cList.pushback(cc);
            }
            aa.bList.pushback(bb);
        }
        aList.pushback(aa);
    }
    省略了类型转换等等没用的部分,语法没有问题,语句也没有问题,这样应该清楚了。
    理想的运行结果是最外层循环运行5W次,最后aList中有5W条记录。
    但是实际运行的时候aList中只存几百条就出错了,跟踪调试发现是执行Sql语句时出错了,错误信息为
        1:SSL安全错误。 
        2:不存在或访问被拒绝。
    两种中的一种,中断处的语句是没有问题的,在数据库中可以执行,即不是语句或程序语法错误,应该是数据库的某种限制。求解决办法
      

  3.   

    貌似是接口写的不好,如果只是循环执行sql语句的话没有问题,但是执行sql语句后取值,取个几百或者几千条出来就会出错了。我再研究下。谢谢大家