如何在数据库里面存储各种格式文件呢?存储图片已经没有问题了!

zjqc 2003-01-11 10:40:28
bcb+sql server2000,存储BMP图片没有任何问题!但是如果存储MP3或者EXE文件!就会出现出错信息是"Invalid class typecast"!大家有没有成功过阿?帮忙一下落!
...全文
143 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
googoler 2003-01-11
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) 果然历害!

原来ADO和BDE处理Blob有所不同!
jishiping 2003-01-11
  • 打赏
  • 举报
回复
用 TADOBlobStream 代替 TMemoryStream。

if(!OpenDialog1->Execute())
return;
ADOTable1->Insert();
ADOTable1->FieldByName("num")->AsString = Edit1->Text;
ADOTable1->FieldByName("age")->AsString = Edit2->Text;
ADOTable1->FieldByName("add")->AsString = Edit3->Text;
TADOBlobStream* Stream = (TADOBlobStream*)ADOTable1->
CreateBlobStream(ADOTable1->FieldByName("photo"),
bwWrite);
Stream->LoadFromFile((OpenDialog1->FileName);
ADOTable1->Post(); delete Stream;
googoler 2003-01-11
  • 打赏
  • 举报
回复
2 zjqc(靓仔强

不好意思,不知道你搞定没有,或者我给个工具你,你试试!


googoler 2003-01-11
  • 打赏
  • 举报
回复
已通过测试,绝对没问题!

环境:bcb6+sp3 win2kp+sp3 BDE访问 IB 6.5表的blob字段写入.exe文件!

在csdn想得50分比在现实世界中挣50元还要麻烦!

-------------------------------------------------------------------
以上所述实属个人胡乱推测,如有雷同,纯属巧合。欢迎各位高手斧正。
仅供参考而已!


googoler 2003-01-11
  • 打赏
  • 举报
回复
估计TBlobField ->LoadFromFile 也会有问题。

Invalid class typecast

从错误上看起来 ADOTable1 Post时应该检查了
("photo")字段是不是BMP格式,看看你的photo字段定义有没有问题!


-------------------------------------------------------------------
以上所述实属个人胡乱推测,如有雷同,纯属巧合。欢迎各位高手斧正。
仅供参考而已!


zjqc 2003-01-11
  • 打赏
  • 举报
回复
to googoler()!你就不能完整试一下吗?这样比猜来猜去好一点!因为我真的很菜!
googoler 2003-01-11
  • 打赏
  • 举报
回复
要不 直接用

TBlobField ->LoadFromFile 试试

-------------------------------------------------------------------
以上所述实属个人胡乱推测,如有雷同,纯属巧合。欢迎各位高手斧正。
仅供参考而已!
黑兵 2003-01-11
  • 打赏
  • 举报
回复
我觉得也是按照二进制存取。可是你存贮EXE文件后,在打开时你还需要把它建立起来吗?没试过,呵,有创意。不行就把机器内码存进去。
zjqc 2003-01-11
  • 打赏
  • 举报
回复
注,上面代码如果是BMP图片就一点问题都没有的!
zjqc 2003-01-11
  • 打赏
  • 举报
回复
问题是一定要把SQL SERVER字段类型改了BINARY才可以读其它,但是这样还是会出错!我不知道代码应该怎么改!才不会出现出错信息是"Invalid class typecast"!
代码:
if(!OpenDialog1->Execute())
return;
TMemoryStream *tmpStream = new TMemoryStream();
TBlobField *tmpField;
tmpStream->LoadFromFile(OpenDialog1->FileName);
ADOTable1->Insert();
ADOTable1->FieldByName("num")->AsString = Edit1->Text;
ADOTable1->FieldByName("age")->AsString = Edit2->Text;
ADOTable1->FieldByName("add")->AsString = Edit3->Text;
tmpField = (TBlobField *)ADOTable1->FieldByName("photo");
tmpField->LoadFromStream(tmpStream);
ADOTable1->Post();//"Invalid class typecast"!出错
tmpField = NULL;
delete tmpStream;
googoler 2003-01-11
  • 打赏
  • 举报
回复
MP3或者EXE文件实际上是二进制流,Blob字段也就是二进制流,所以肯定没问题!

不清楚你的具体情况,可以不可以贴出你的代码?

-------------------------------------------------------------------
以上所述实属个人胡乱推测,如有雷同,纯属巧合。欢迎各位高手斧正。
仅供参考而已!
zjqc 2003-01-11
  • 打赏
  • 举报
回复
请楼上去领分!
http://expert.csdn.net/Expert/topic/1349/1349330.xml?temp=.212887
zjqc 2003-01-11
  • 打赏
  • 举报
回复
请楼上去领分!
googoler 2003-01-11
  • 打赏
  • 举报
回复
从错误上看起来 ADOTable1 Post时应该检查了
("photo")字段是不是BMP格式,看看你的photo字段定义有没有问题!


呀,偶前面的推断还是正确的哦!嘻嘻!

抢分

-------------------------------------------------------------------
把有限的生命投入到无限的CSDN之C++Builder版灌水(抢分中去)
灌呀...............
抢呀...............
zjqc 2003-01-11
  • 打赏
  • 举报
回复
一句话!一个美丽的误会!原来我那个字段用了DBIMAGE做了一个关联!我把那个该死的东西删除了!就没有问题!成功读入跟调出!呵呵!不过很佩服季世平!前段时间还说不懂ADO!现在就这样了!不是佩服水平!而是佩服那种求知欲!我不服都不行!问题没有了!可以的!一样读出读入!大家都可以!不过问题有一个!就是文件一大说有长度限制!这是唯一的谜底!希望大家继续关注!呵呵!结贴!
黑兵 2003-01-11
  • 打赏
  • 举报
回复
if(ADOTable1->State==dsEdit)
{
ADOTable1->Post();
Application->MessageBox("存贮成功!","提示", MB_OK);
}
zjqc 2003-01-11
  • 打赏
  • 举报
回复
一句话!一个美丽的误会!原来我那个字段用了DBIMAGE做了一个关联!我把那个该死的东西删除了!就没有问题!成功读入跟调出!呵呵!不过很佩服季世平!前段时间还说不懂ADO!现在就这样了!不是佩服水平!而是佩服那种求知欲!我不服都不行!问题没有了!可以的!一样读出读入!大家都可以!不过问题有一个!就是文件一大说有长度限制!这是唯一的谜底!希望大家继续关注!呵呵!结贴!
jishiping 2003-01-11
  • 打赏
  • 举报
回复
上面的代码,下午亲自测试过的,用的BCB5+SQL Server2000。我想一定是你
什么地方写错了。不过和你说句老实话,我从来没有用ADO写过程序,只是在
CSDN上有时帮别人解答时测试时用一下。
zjqc 2003-01-11
  • 打赏
  • 举报
回复
大哥!我很佩服你的水平!但是问题是我就是用你的代码!可是运行时候就是出现说我dataset close了!不能执行!奇怪!我们明明INSERT了!不过还是解决了!用其它方法!
jishiping 2003-01-11
  • 打赏
  • 举报
回复
有点笔误,自己改一下不就可以了。这也要我说呀。
if(!OpenDialog1->Execute())
return;
ADOTable1->Insert();
ADOTable1->FieldByName("num")->AsString = Edit1->Text;
ADOTable1->FieldByName("age")->AsString = Edit2->Text;
ADOTable1->FieldByName("add")->AsString = Edit3->Text;
TADOBlobStream* Stream = (TADOBlobStream*)ADOTable1->
CreateBlobStream(ADOTable1->FieldByName("photo"),
bmWrite);
Stream->LoadFromFile(OpenDialog1->FileName);
delete Stream; ADOTable1->Post();
加载更多回复(8)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧