SQL SERVER 数据库 更新数据 update table set A=B,如果字段A的数据类型为image!请问应该怎么处理?

jiang1982 2005-01-21 01:30:43
我以前是采用把图片读到MemoryStream
ms := TMemoryStream.Create;
image1.Picture.Graphic.SaveToStream(ms);
ms.Position := 0;
..
TBlobField( FieldByName('图')).LoadFromStream(ms);
Post;

如果用UPDATE TABLENAME SET 图 = ??
应该写?
...全文
946 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyf99 2005-01-22
  • 打赏
  • 举报
回复
顶!
chinaandys 2005-01-22
  • 打赏
  • 举报
回复
学习学习 jinjazz(近身剪(N-P攻略))
gyf 2005-01-22
  • 打赏
  • 举报
回复
双击ADOQuery1看看是不是你在ADOQuery1其中加入了字段ID?我以前也遇到这个问题,后来才知道是在其中加入了ID字段,还有对于更新image类型的字段我的代码如下,希望对你能有所帮助
procedure TForm1.BitBtn1Click(Sender: TObject);
var
QQ:TAdoQuery;

SD:TStringStream;
FS:TFileStream;
ret:integer;

begin
if Not FileExists(Edit1.Text) then
begin
MessageBox(self.Handle,Pchar('Îļþ '+Edit1.text + ' ²»´æÔÚ!'),'×¢ÒâÁË',mb_iconexclamation);
Exit;
end;
QQ:=TAdoQuery.Create(self);
QQ.Connection := AdoConn;
with QQ do
begin

SD:=TStringStream.Create('');
FS:=TFileStream.Create(Op.FileName,fmOpenRead);
FS.Position :=0;
SD.CopyFrom(FS,FS.Size);
FS.Free;
Close;
SQL.Clear;
SQL.Add('UpDate UpDateFiles Set ExeFileBody=:ExeBody,Status=1,UpdateDate='''+DateTimeToStr(DT.DateTime)+''',HintDetails='''+Memo1.Text+''' where ID='+IntToStr(DbGridEh1.DataSource.DataSet.FieldByName('ID').AsInteger));
Parameters.ParamByName('ExeBody').LoadFromStream(SD,ftBlob);
ret:=ExecSQL;
SD.Free;

end;

end;
mqjshanghai 2005-01-21
  • 打赏
  • 举报
回复
jinjazz 2005-01-21
  • 打赏
  • 举报
回复
我觉得你的ADOQuery没有连接ADoConnection
jiang1982 2005-01-21
  • 打赏
  • 举报
回复
还是不行,我试了很多方法了,但还是会出现 ADOQuery1: Parameters'ID' not found的错误,我在Parameters里也手动添加了,但还是不行
procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('UPDATE FileInfoAll SET ID =: ID');
SQL.Add('WHERE ID=2');
Parameters.ParamValues['ID']:= 3;
ExecSQL;
end;
end;
jinjazz 2005-01-21
  • 打赏
  • 举报
回复
UPDATE tabe SET NEW=: NEW where...

Sail365 2005-01-21
  • 打赏
  • 举报
回复
是 = :NEW 不是 := NEW
jiang1982 2005-01-21
  • 打赏
  • 举报
回复
而且,UPDATE语句 SET NEW:= NEW 这里能用:=的吗?
jiang1982 2005-01-21
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('UPDATE FileInfoAll SET NEW:= NEW');
SQL.Add('WHERE ID=2');
Parameters.ParamValues['NEW']:= '23232323';
ExecSQL;
end;
end;

楼上的大哥,我照你的方法做了,但到了Parameters.ParamValues['NEW']:= '23232323',这句就会出现Parameter 'NEW' not found的错误,但表中确实存在该字段
web700 2005-01-21
  • 打赏
  • 举报
回复
楼上强。
象楼上学习
jinjazz 2005-01-21
  • 打赏
  • 举报
回复
>>AdoQuery1.Parameters.ParamByName('photo').LoadFromStream(MS, ftblob);

这一句就是了
jinjazz 2005-01-21
  • 打赏
  • 举报
回复
var
MyJPEG: TJPEGImage;
MS: TMemoryStream;
begin
if MessageDlg('确实要修改该员工资料?', mtwarning, [mbyes, mbno], 0) = mrno
then
exit;
if not CheckNull(self, true) then
exit;
with AdoQuery1 do
begin
SQL.Clear;
SQL.Add('update Personnel set CardNo=:CardNo,RecNo=:RecNo,ContractNo=:ContractNo,');
SQL.Add('DeptIndex=:DeptIndex,PersonnelName=:PersonnelName,Sorts=:Sorts,');
SQL.Add('Duty=:Duty,StartDate=:StartDate,EndDate=:EndDate,Native=:Native,');
SQL.Add('Race=:Race,Birthday=:Birthday,Politics=:Politics,Educational=:Educational,');
SQL.Add('Photo=:Photo,Address=:Address,PostCode=:PostCode,Telephone=:Telephone,');
SQL.Add('Mobile=:Mobile,EducationDesc=:EducationDesc,WorkDesc=:WorkDesc,');
SQL.Add('PrizeDesc=:PrizeDesc,FamilyDesc=:FamilyDesc');
SQL.Add('where PersonnelId=:PersonnelId');
Parameters.ParamValues['PersonnelId'] := EditPersonnelId.Text;
Parameters.ParamValues['CardNo'] := EditCardNo.Text;
Parameters.ParamValues['RecNo'] := EditRecNo.Text;
Parameters.ParamValues['ContractNo'] := EditContractNo.Text;
Parameters.ParamValues['PersonnelName'] := EditPersonnelName.Text;
Parameters.ParamValues['DeptIndex'] := DeptCode;
Parameters.ParamValues['Sorts'] := ComboboxSorts.Text;
Parameters.ParamValues['Duty'] := ComboboxDuty.Text;
Parameters.ParamValues['StartDate'] := DateTimePickerStartDate.DateTime;
Parameters.ParamValues['EndDate'] := DateTimePickerEndDate.DateTime;
Parameters.ParamValues['Native'] := EditNative.Text;
Parameters.ParamValues['Race'] := ComboboxRace.Text;
Parameters.ParamValues['Birthday'] := DateTimePickerBirthday.DateTime;
Parameters.ParamValues['Politics'] := ComboboxPolitics.Text;
Parameters.ParamValues['Educational'] := ComboboxEducational.Text;
MyJPEG := TJPEGImage.Create;
MS := TMemoryStream.create;
try
with MyJPEG do
begin
if Image1.Picture.Graphic <> nil then
Assign(Image1.Picture.Graphic);
SaveToStream(MS);
MS.Position := 0;
AdoQuery1.Parameters.ParamByName('photo').LoadFromStream(MS, ftblob);
end;
finally
MyJPEG.Free;
MS.Free;
end;
Parameters.ParamValues['Address'] := EditAddress.Text;
Parameters.ParamValues['PostCode'] := EditPostCode.Text;
Parameters.ParamValues['Telephone'] := EditTelephone.Text;
Parameters.ParamValues['Mobile'] := EditMobile.Text;
Parameters.ParamValues['EducationDesc'] := MemoEducationDesc.Text;
Parameters.ParamValues['WorkDesc'] := MemoWorkDesc.Text;
Parameters.ParamValues['PrizeDesc'] := MemoPrizeDesc.Text;
Parameters.ParamValues['FamilyDesc'] := MemoFamilyDesc.Text;
try
ExecSQL;
showmessage('档案修改成功!')
except on e: exception do
application.MessageBox(pchar('添加修改失败:' + e.Message), '提示',
MB_ICONWARNING)
end;
end;
end;
jiang1982 2005-01-21
  • 打赏
  • 举报
回复
回复人: jinjazz(近身剪(N-P攻略))

楼上的你没看清我的问题吗?

你说的方法我知道啊,我的意思是用SQL语句直接存储
jiang1982 2005-01-21
  • 打赏
  • 举报
回复
SET 图 = image

这里的image可不可以是memorystream的?我试过不行,不知道是不是我代码上的问题
jinjazz 2005-01-21
  • 打赏
  • 举报
回复
如何实现在MS Access数据库中图像的存储和显示
一、 原理介绍??流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源,但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB??Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上是以二进制数据的形式存放的。
为了处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,大大提高运行效率。
具体的过程和相关的程序代码如下:
1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。

jiang1982 2005-01-21
  • 打赏
  • 举报
回复
to 回复人: Sail365(疯狂编码美眉之帅帅哥哥)

说具体点好吗?
Sail365 2005-01-21
  • 打赏
  • 举报
回复
用参数传递

2,497

社区成员

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

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