1.CRecordset(不是派生类)是不是只能用forwardOnly方式打开?我试了其他几种都不行。如果那样的话,做虚拟列表的时候,SetAbsolutePosition就不能用了。是不是做虚拟列表的时候,只能用派生类?2数据集中的数据什么时候读到内存中?是Open的时候还是MoveNext的时候?
我曾经在MoveNext的时候,到1万多条的时候,出现内存不足。是不是MoveNext的时候才放到内存中?如果用SetAbsolutePosition(10000),那么前面的记录有没有放到内存中?
我曾经在MoveNext的时候,到1万多条的时候,出现内存不足。是不是MoveNext的时候才放到内存中?如果用SetAbsolutePosition(10000),那么前面的记录有没有放到内存中?
解决方案 »
- 关于输入文字和重绘
- VC++实现位图显示透明效果
- MFC自绘按钮问题
- 知道网卡名称,如何得到IP地址?
- 我刚学VC按照孙鑫老师视频的第一课写了个程序,编译没错,但不能运行,请问错在哪里,谢谢!!
- 如何将一幅图片设置为桌面壁纸?用哪个api函数或windows命令?谢谢
- 多文档与单文档,还有多视图的问题
- 如何在VC++中静态连接一个库。
- 我用atl写的com组件在其它的机器上无法注册!我想得头都大了!80分
- 请教web聊天时掉线的原因(从理论分析)以及说不出话的原因
- 处于死循环的窗口无法接收消息,如何解决?
- 大家给个思路--我想让用户双击分区时(C:,D:,E:等)先运行我的程序,然后再进入分区
数据库中的数据不会一次读到内在中的,因为:
1、如果数据库中有几十亿或上百亿的数据怎么一次性读到内存中?这需要多大的内存和时间?
2、MoveNext()是调用ODBC API的SQLExtendedFetcht和SQLFetch来实现的,这些函数只是读入一些特定行的。这个可以参考MSDN。
如果这样,不应有内存问题.
2.应该不是一次性读入的,默认读入多少行SQL SERVER应该自己知道。
{ seq_no varchar2(20);
count_no varchar2(20);
cp_flag varchar2(2);
count int;
name varchar2(200);
}
查询语句能否实现:
如 select * from test t1
where cp_flag='1'
and exists(select * from test t2
where t2.count_no = t1.count_no
and cp_flag not in ('2','3');)
假如 只派生一个CRecordset 如何能够实现呢?现有一个方法
1.通过建一个view 。CRecordset 从view 中取数。想使用ODBC中的方法。thx.
用 CRecordset 通过ODBC 查询 ORACLE 时,查询的语句能不能用子查询呢?table test
{ seq_no varchar2(20);
count_no varchar2(20);
cp_flag varchar2(2);
count int;
name varchar2(200);
}
查询语句能否实现:
如 select * from test t1
where cp_flag='1'
and exists(select * from test t2
where t2.count_no = t1.count_no
and cp_flag not in ('2','3');)
1。使用派生类,对应的表选test t1,选中你所要用到的所有字段。
CMyRecordset rs;
rs.Open("select ....");
2.直接使用CRecordset打开,用GetFieldValue取得每个字段的值。请不要在这里提问题了。另开贴子吧。
str="select * from table1";
m_set.Open(CRecordset::snapshot,str);
while (!m_set.IsEOF())
m_set.MoveNext();其他操作都没做。然后就内存不足了(有兴趣的可以试一下,找个几万条的表,用forwardOnly以外的方式打开)。我打开一个有8万条记录的表,花了很长时间,看到c盘下的空间一直减小。临时文件增大到500M,最后,硬盘没有空间当缓冲区了,就发生错误了。
如果用snapshot改成forwardOnly,就不会发生错误。数据库Oracle.不知道为什么,我只能用snapshot和forwardOnly两种方式打开。可能是数据库的关系。我认为Move的时候,是有分配内存空间的。只有forwardOnly方式没有。主要是forwardOnly没有调用DoFieldExchange().
void CDlgNumChg::OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
short index = pDispInfo->item.iItem;
short subItem = pDispInfo->item.iSubItem;
if(pDispInfo->item.mask & LVIF_TEXT)
{
try
{
m_set.SetAbsolutePosition(index+1);//Set the file to desired index
CString szValues;
if(subItem)
m_set.GetFieldValue(subItem, szValues);
else
m_set.GetFieldValue(short(0), szValues);
lstrcpyn(pDispInfo->item.pszText, szValues, pDispInfo->item.cchTextMax);//set item text }
catch(CDBException* e)
{
e->ReportError();
e->Delete();
return;
}
}
*pResult = 0;
}
m_set.SetAbsolutePosition(index+1);//Set the file to desired index
是不是该改为m_set.Requey();
for (int i=0;i<index;i++)
m_set.MoveNext();//这样如果是排在后面的记录,不是慢死了?或CString str;
str="select ... from (select rownum,... from table where..) where rownum = index);
m_set.strFilter = str;
m_set.Requery();
...还没试,不知可行否?
如果你在数据表中有行数的话,我还是比较喜欢自已处理行号问题,如你的:
或CString str;
str="select ... from (select rownum,... from table where..) where rownum = index);
m_set.strFilter = str;
m_set.Requery();
...