问题:
有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分,谢谢大家了
有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分,谢谢大家了
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
表结构如下:
表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:不存在或访问被拒绝。
两种中的一种,中断处的语句是没有问题的,在数据库中可以执行,即不是语句或程序语法错误,应该是数据库的某种限制。求解决办法