散分咯,大家快来看看:用CreateOleObject创建ADO对象向数据库写入BMP图象总提示Invalid Typecast,怎么解决呀?自己已经解决,愿与

  • 主题发起人 主题发起人 lyj.hm
  • 开始时间 开始时间
L

lyj.hm

Unregistered / Unconfirmed
GUEST, unregistred user!
散分咯,大家快来看看:用CreateOleObject创建ADO对象向数据库写入BMP图象总提示Invalid Typecast,怎么解决呀?自己已经解决,愿与大家共享(150分)<br />begin
try //建立记录集
rst.Open('tCardInfo',conn,adOpenDynamic,adLockOptimistic,adCmdTable);
BMP := TBitmap.Create; //建立图象对象
MS := TMemoryStream.Create; //建立流对象

rst.AddNew;//--------------------------------------------- 添加一条记录
rst.FieldByName('uName'):=uName;
rst.FieldByName('Sex'):=Sex;
rst.FieldByName('Nation'):=Nation;
rst.FieldByName('Birthday'):=Birthday;
rst.FieldByName('Address'):=Address;
rst.FieldByName('CardID'):=CardID;
rst.FieldByName('IssueDept'):=IssueDept;
rst.FieldByName('ValidStartDate'):=ValidStartDate;
rst.FieldByName('ValidEndDate'):=ValidEndDate;
rst.FieldByName('NewAddress'):=NewAddress;
try //----------------------------保存图象
BMP.Assign(imgPhoto.Picture.Graphic); //为显示的图象分配内存
BMP.SaveToStream(MS); //将图象转化为流对象
TBlobField(rst.Fields(12)).LoadFromStream(MS); //&lt;------错误在这里 Error:Invalid typeCast
finally
MS.Free;
BMP.Free;
end; //---------------------------------保存图象END
rst.Update;//--------------------------------------------- 更新记录

except
sbStauts.Panels[1].Text:='活动串口:'+IntToStr(comPort)+'; 记录集打开失败';
exit;
end;

end;
 
TBlobField(rst.Fields(12)).LoadFromStream(MS);是不是类型搞错了哟
 
你能说具体点吗?是哪里有错呀?我检查了半天,好象没错误呀?
 
rst.Fields(12)原来是什么类型的,Invalid Typecast是指强制类型转换错误.
 
是ACCESS数据库的OLE对象
 
最后解答:
我用的后台是ACCESS,而访问数据库是使用了原生的ADO。之所以使用原生的ADO,是因为如果使用BDE,则分发程序时还要安装BDE,挺麻烦。而且程序也变大了。效率也不如原生的ADO高,灵活性也是降低了很多。
上面的错误在于,ACCESS的OLE对象是不支持流直接写入的,所以出现编译错误:INVALID TYPECAST就是说DELPHI在做类型转换的时候无法通过。那么到底要变换成什么数据类型ACCESS才可以接受呢?答案是:VARIANT数据类型。也就是说还需要把数据流转换成VARIANT类型才可以上传到ACCESS当中去。我用了一个函数将流转换成了函数,然后再赋值给OLE对象,编译成功了。呵呵,真不简单啦。
转换函数如下,希望对大家有帮助!
rst.Fields['Photo']:=StreamToVariant(MS);&lt;----------------以前出错的地方改为这样

//这是转换函数
function StreamToVariant(Stream: TStream): OleVariant; //流转为olevariant
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;

当然,读取时图象时也要相应的转换,我就不帖出来了。自己研究一下。如果弄不出来,欢迎与我联系;QQ:602027784 。愿与大家共同进步
 
多人接受答案了。
 
后退
顶部