在做好的程序中,有一个表 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 个人版防火墙
哪位能够解释一下,或提出解决方法。
先在此谢谢各位的参与!
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 个人版防火墙
哪位能够解释一下,或提出解决方法。
先在此谢谢各位的参与!
不明白怎么会这样呢。
我记得ACCESS数据库文件最大的容量是1G???
先一下
pField=(TBlobField *)DataSet->FieldByName("Comm");
pStream->Clear(); //少了这一句,导致数据膨胀
pField->SaveToStream(pStream);
pStream->Position=0;
pFieldTemp=(TBlobField *)DataSet->FieldByName("CommTemp");
pFieldTemp->LoadFromStream(pStream);
DataSet->Post();