void CJCZLDlg::OnOK() 
{
CDWordArray copylist;//用于存拷贝记录的标号的数组,第一个元素copylist[0]用来存放数组中存放的元素个数
CKCDM dbS,dbD;//源记录集和目标记录集
dbS.SetConnect (GetSourceConn());
dbD.SetConnect(GetDestinationConn());
dbS.Open();
dbD.Open();
while(!dbS.IsEOF ()) dbS.MoveNext ();//得到记录总数

TRACE("%d,记录总数\n",dbS.GetRecordCount ());

copylist.SetSize (dbS.GetRecordCount ()+500,500);
copylist[0]=0;
//准备要复制的列表
int k=1;
dbS.MoveFirst ();
while(! dbS.IsEOF ())
{
if ((dbS.m_ckdm.Left (2)+dbS.m_dm ) > (dbD.m_ckdm.Left (2)+dbD.m_dm ) )
if(!dbD.IsEOF ())dbD.MoveNext ();
else break;
else if ((dbS.m_ckdm.Left (2)+dbS.m_dm ) == (dbD.m_ckdm.Left (2)+dbD.m_dm ) )
{
dbS.MoveNext ();
if(!dbD.IsEOF()) dbD.MoveNext ();
else break;
}
else
{
copylist[0]=copylist[0]+1;
copylist[copylist[0]]=k;
dbS.MoveNext();
}
k++;
}
while(! dbS.IsEOF ())
{
copylist[0]=copylist[0]+1;
copylist[copylist[0]]=k;
dbS.MoveNext();
k++;
}
//以上循环部分对磁盘的要求好象很高,不知是为什么
//开始进行复制
int abc=copylist[0];
m_pro.SetRange32 (0,(long)copylist[0]);//设置进度条
m_pro.SetPos (1); dbS.MoveFirst();
// dbD.MoveLast ();
long i=1;
long m=copylist[0];
long j=1;
while(!dbS.IsEOF()&& (j<=m))
{
if(i==(long)copylist[j])
{
dbD.AddNew ();
dbD.SetFieldNull (NULL);
dbD.m_ckdm =dbS.m_ckdm;
dbD.m_dm =dbS.m_dm;
dbD.m_mc = dbS.m_mc;
dbD.m_islb =dbS.m_islb ;
dbD.m_chlb =dbS.m_chlb ;
dbD.m_ffid =dbS.m_ffid ;
dbD.m_dw = dbS.m_dw;
dbD.m_gg = dbS.m_gg;
dbD.m_txm = dbS.m_txm; dbD.SetFieldDirty (NULL);
// try{
dbD.Update ();
// }catch(...){}
m_pro.SetPos(j++);
}
i++;
dbS.MoveNext();
}
CString s;
s.Format ("数据转移已完成!共%d条记录被加入",(long)copylist[0]);
AfxMessageBox(s);
m_pro.SetPos(0);
}
我要转移的数据只有1000多条,但确用了100多M的磁盘空间,这是什么原因???
时间还很长。
我这个程序是用来进行30000条记录的转出的,那就是要用几吉的空间作缓冲,这怎么可能?Why,Why,Why?

解决方案 »

  1.   

    你用的是什么数据库?如果是SQL SERVER的话你可以用它自带的任务来做的,我就用的那个而且我每天转换的数据都要不下150000条,一直都没出现磁盘空间问题。
      

  2.   

    谢谢楼上两位,我已经找到原因了,原因是因为我使用了默认的记录集类型,
    默认的记录集类型是静态的快照集,使用动态记录集就没有这个问题了
    大概是静态记录集想提高效率使用了文件缓冲的结果.
    不过我的程序运行对于29000条的表要花20分钟才能完成,却不知何故
    是不是要使用批处理模式才行呢
    请问kneek(friend):
    你是用什么工具转的,速度快不快?