在做好的程序中,有一个表 Survey 结构如下:SurveyID int *
Comm     Memo
SurveyStatus char(20)背景情况1:由于SurveyStatus是字符串,里面的内容实际上是比较固定的类型,所以将表修改为SurveyID int *
Comm     Memo
SurveyStatusID int背景情况2:程序是以框架:
   Access + BDE + scktsrvr.exe (服务端), TClientDataSet + TSocketConnection (客户端)在实际应用中,发现 数据经常因为 Comm 引起 "字符串右截断" 错误(程序是给美国公司使用,所以测试中仅仅是用 英文测试,文本内容大约是300字符左右,每次是LoadFromFile方式读入用于测试,服务端已经设置使用 upWhereKeyOnly 方式),所以将 Memo 类型改为 Blob 类型,即Access数据中的 OLE 类型。因为程序已经被使用,所以在修改数据库时,必须保证不丢失原有数据信息,所以做了一个补丁程序,将数据库结构改变,并将原来的数据转入新的表中操作步骤:
1. 将 SurveyStatus 转换成 SurveyStatusID
 Alter Table Survey Add SurveyStatusID  int null
 Update Survey Set SurveyStatusID=x Where SurveyStatus='xx'
 Alter Table Survey  DROP COLUMN SurveyStatus*此步骤没有发现问题2. 将 Memo类型 转成 OLE类型
 Alter Table Survey Add CommTemp OLE null
 
 TBlobField *pField, *pFieldTemp;
 TMemoryStream *pStream=new TMemoryStream();*表中已经有20,000多数据
奇怪问题1: DataSet->Edit();
 pField=(TBlobField *)DataSet->FieldByName("Comm");
 pField->SaveToStream(pStream);
 pStream->Position=0;
 pFieldTemp=(TBlobField *)DataSet->FieldByName("CommTemp");
 pFieldTemp->LoadFromStream(pStream);
 DataSet->Post();当修改到大约第300条后数据时,出现:"不合法的参数量"错误,查不出问题就改成使用Update SQL语句。遇到了奇怪问题2: tempData->CommandText="Update Survey Set CommTemp=:Data Where SurveyID=:ID" ;
 tempData->Prepare();
 ...
 tempData->Params->Items[0]->LoadFromStream(pStream,ftBlob); 
 tempData->Params->Items[1]->Value=DataSet->FieldByName("SurveyID")->Value;
 tempData->Execute();
 
 当修改到 约 15,000 条数据时,出现:"找不到Field: 'SurveyStatus'". 字段SurveyStatus已经被删除了,而执行的sql语句与SurveyStatus没有任何关系,Access到底这么了?
 
 这是这个数据库文件的字节已经从 16M 膨胀到了 2G (硬盘还有2G空间), 试了几次,结果都差不多。
 
 *机器环境:Win2000 + sp4 + RPC补丁+ Norton 2003(200.11.26病毒库)+Norton 个人版防火墙
 
 哪位能够解释一下,或提出解决方法。
 
 先在此谢谢各位的参与!

解决方案 »

  1.   

    这是这个数据库文件的字节已经从 16M 膨胀到了 2G (硬盘还有2G空间), 试了几次,结果都差不多。
     不明白怎么会这样呢。
      

  2.   

    这是这个数据库文件的字节已经从 16M 膨胀到了 2G?
    我记得ACCESS数据库文件最大的容量是1G???
    先一下
      

  3.   

    问题查到了: DataSet->Edit();
     pField=(TBlobField *)DataSet->FieldByName("Comm");
     pStream->Clear();  //少了这一句,导致数据膨胀
     pField->SaveToStream(pStream);
     pStream->Position=0;
     pFieldTemp=(TBlobField *)DataSet->FieldByName("CommTemp");
     pFieldTemp->LoadFromStream(pStream);
     DataSet->Post();