关于ado对sqlserver2000的image字段的错误

baitianhai 2003-03-11 10:06:32
AdocomPO.Parameters[5].LoadFromFile(trim(self.Edit5.Text),ftBlob);
我这样用的,可是为什么提示 '将截断字符串或二进制数据'
...全文
39 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Drate 2003-03-11
呵呵,帮你贴一段李维的书中关于操作BLOB的代码吧,你自己看一看:

用ADO处理BLOB信息
对于许多程序员来说,除了需要在应用程序中处理一般类型的数据,例如字
符串、整数数据、浮点数据和文字数据之外,也会需要处理特殊类型的数据,例
如影像数据、图形数据、声音数据或是其他大型的数据。这些类型的数据统称为
BLOB(Binary Large OBject)类型的数据。
A D O提供了非常好的支持,让程序员开发处理B L O B类型的应用程序。此外
A D O E x p r e s s组件组也提供了数个Object Pascal的类别帮助程序员处理B L O B类型的
数据,以提高程序员的生产力。现在就让我们使用A D O E x p r e s s组件和它的辅助类
别来开发本节的范例应用程序。
图3 - 4是稍后的范例应用程序使用的范例数据表的结构。这个范例数据表是
Access 2000的数据表。从这个数据表结构中可以看到,该表使用了数种不同的字
段类型,包括A u t o I n c r e m e n t字段类型、文字字段类型和属于B L O B类型的O L E对象
字段类型等。这个范例应用程序能够在图3 - 4的B l o b s字段中加入影像、图形、声音、
O L E对象或任何大型类型的数据。
图3-4 范例应用程序使用的数据表结构
图3 - 5则是范例数据表中包含的数据。从图3 - 5中可以看到,范例数据表包含许
多不同种类的数据,如M P G影片、Wo r d文件、P o w e r P o i n t演示文稿文件和E x c e l的
试算数据等。
图3-5 范例数据表包含的数据
这个范例应用程序的功能是可以让用户输入图3 - 4中I D,N a m e和E x t e n s i o n这
三个字段的数据,并且从文件中加载B L O B类型的数据到B l o b s字段中。此外,范
例应用程序也可以在用户浏览范例应用程序的每一笔数据时显示B l o b s字段中的数
据。
现在就让我们一步一步地使用A D O E x p r e s s组件和它的辅助类别来完成这个范
例应用程序。该程序使用了图3 - 4的范例数据表,可以在光盘中找到这个范例数据
表,或自己建立如图3 - 4的范例数据表。
1) 在D e l p h i集成开发环境中关闭所有的项目。
2) 建立一个新的应用程序项目,在主窗体中放入TA D O C o n n e c t i o n对象连接到
范例Access 2000数据库。
1 0 2 Delphi 5.x ADO/MTS/COM+高级程序设计篇
下载
3) 在主窗体中放入TA D O D a t a S e t组件。设定它的C o n n e c t i o n属性值为步骤2 )
的TA D O C o n n e c t i o n,并且在它的C o m m a n d Te x t属性值中使用Select * from 范例数
据表以取得所有的数据。再设定它的A c t i v e属性值为Tr u e以打开范例数据表。
4) 放入T D a t a S o u r c e组件,设定它的D a t a S e t属性值为步骤3) 加入的
TA D O D a t a S e t组件。
5) 放入T D B N a v i g a t o r和T D B G r i d组件,设定它们的D a t a S o u r c e组件为步骤4 )
加入的T D a t a S o u r c e组件。
6) 在主窗体中放入一个TO L E C o n t a i n e r组件,再放入一个TO p e n D i a l o g组件。
7) 最后在主窗体下方放入两个T B u t t o n组件,此时主窗体看起来如图3 - 6所示。
图3-6 范例应用程序的主窗体
图3 - 6中“加载目标”按钮可以让范例数据表进入编辑模式,并且开启一个对
话框让用户选择要从哪一个文档加载B l o b s字段的数据。而“显示B l o b内容”按钮
第3章撰写使用A D O技术的应用系统(二) 1 0 3
下载
TOLEContainer组件
则可以在窗体的TO l e C o n t a i n e r组件中显示B l o b s字段的数据。由于这个范例应用程
序使用的都具备O L E的能力,因此范例应用程序的TO l e C o n t a i n e r组件能够直接激
活相关的Wi n d o w s应用程序。稍后我们会看到TO l e C o n t a i n e r组件的动作。
现在我们要开始实现这两个按钮的O n C l i c k事件处理程序。
8) 双击“加载目标”按钮,在它的事件处理程序中撰写如下的程序代码:
p r o c e d u r e TForm1.btnTargetClick(Sender: TObject);
v a r
sFileName : String;
f u n c t i o n B l o b C o n t e n t T o S t r i n g (c o n s t FileName: string): string;
b e g i n
w i t h TFileStream.create(FileName, fmOpenRead) d o
t r y
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
f i n a l l y
F r e e ;
e n d ;
e n d ;
b e g i n
i f (OpenDialog1.Execute) t h e n
b e g i n
sFileName := OpenDialog1.FileName;
a d o d s B l o b s . E d i t ;
adodsBlobs.FieldByName('Blobs').AsString :=
B l o b C o n t e n t T o S t r i n g ( s F i l e N a m e ) ;
a d o d s B l o b s . P o s t ;
e n d ;
e n d ;
“加载目标”按钮的O n C l i c k事件处理程序首先通过TO p e n D i a l o g打开一个对话
框让用户选择要加载的文档,然后让步骤3) 的TA D O D a t a S e t进入编辑模式,再调
用B l o b C o n t e n t To S t r i n g方法把指定的文档内容以文字流方式指定给范例数据表的
B l o b s字段。最后调用步骤3的TA D O D a t a S e t组件的P o s t方法以便把B L O B数据储存
到数据表中。
1 0 4 Delphi 5.x ADO/MTS/COM+高级程序设计篇
下载
至于B l o b C o n t e n t To S t r i n g方法则是使用T F i l e S t r e a m对象从打开的文档中读取
数据,并且把文档内容转换为字符串流。
9) 双击“显示B l o b内容”按钮,在它的事件处理程序中撰写如下的程序代码:
p r o c e d u r e TForm1.btnShowBlobsClick(Sender: TObject);
v a r
sFileName: String;
BS : TADOBlobStream;
b e g i n
BS :=
T A D O B l o b S t r e a m . C r e a t e ( T B l o b F i e l d ( a d o d s B l o b s . F i e l d B y N a m e ( ' B l o b s ' ) ) ,
b m R e a d ) ;
t r y
sFileName := ExtractFilePath(Application.ExeName)+'tmpBlob';
sFileName := sFileName + '.' +
a d o d s B l o b s . F i e l d B y N a m e ( ' E x t e n s i o n ' ) . A s S t r i n g ;
B S . S a v e T o F i l e ( s F i l e N a m e ) ;
OleContainer1.CreateObjectFromFile(sFileName, False);
f i n a l l y // wrap up
B S . F r e e ;
e n d ; // try/finally
e n d ;
“显示B l o b内容”按钮的O n C l i c k事件处理程序使用了A D O E x p r e s s提供的
TA D O B l o b S t r e a m类别,从B L O B类型的字段中读取数据。在B D E / I D A P I中是以
T B l o b S t r e a m类别来辅助程序员处理B L O B类型的数据。但是在A D O中程序员必须
使用TA D O B l o b S t r e a m类别,而不能使用T B l o b S t r e a m类别。
上面的程序代码首先建立一个TA D O B l o b S t r e a m对象,并且从范例数据表的
B l o b s字段中读取B L O B类型的数据。然后以应用程序的名称以及E x t e n s i o n字段的
延伸文件名称组成一个暂时的文件名称,并把TA D O B l o b S t r e a m对象中的B L O B数
据撰写在这个暂时文档中。最后调用TO l e C o n t a i n e r组件的C r e a t e O b j e c t F r o m F i l e方
法,把这个文档和TO l e C o n t a i n e r组件关联起来并且激活系统中能够处理这种文档
类型的应用程序。
第3章撰写使用A D O技术的应用系统(二) 1 0 5
下载
  • 打赏
  • 举报
回复
baitianhai 2003-03-11
我的 self.Edit5.Text是文件名
  • 打赏
  • 举报
回复
baitianhai 2003-03-11
to Drate(鸟窝里的虫):
下面的两句是干什么的?
fn := ExtractFileName(OpenDialog1.FileName);
Table1ABlob.LoadFromFile("tmp"); //将OLE数据存入数据库
我用的是参数的方法,该怎么办那?
  • 打赏
  • 举报
回复
Drate 2003-03-11
//打开一个数据文件、创建OLE对象、将对象数据存入数据库
procedure TForm1.LoadBtnClick(Sender: TObject);
var
fn: string;
begin
 if OpenDialog1.Execute then begin //打开文件
  fn := ExtractFileName(OpenDialog1.FileName);
  Table1FileName.AsString := fn;
  OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False); //创建OLE对象
  OleContainer1.SaveToFile("tmp"); //将OLE数据存入临时文件
  Table1ABlob.LoadFromFile("tmp"); //将OLE数据存入数据库
 end;
end;
  • 打赏
  • 举报
回复
Drate 2003-03-11
是这样写的吗?

不能吧!

  • 打赏
  • 举报
回复
coolnan 2003-03-11
很简单,注意是bmp图片,使用DBImage的好处就在这里,只需要将图片存入数据库就可以了,显示时会自动读出。
if OpenPicturedialog1.Execute then
begin
ls_zp:=OpenPicturedialog1.FileName;
TBlobField(ADOTable.FieldByName('zp')).LoadFromFile(ls_zp);
DBImage.Picture.LoadFromFile(ls_zp);
end;
  • 打赏
  • 举报
回复
醉马不肖 2003-03-11
up
  • 打赏
  • 举报
回复
发帖
数据库相关

2473

社区成员

Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
帖子事件
创建了帖子
2003-03-11 10:06
社区公告
暂无公告