Sql怎么在表中添加图片?

ZgxY 2020-06-10 04:28:16
相片:rdphoto(需要支持照片流存入)
...全文
1496 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
changfenglee 2020-07-08
  • 打赏
  • 举报
回复
首先你必须在数据库建一个字段来保存图片的流数据,如SQL数据库,字段类型就为IMAGE,然后只需要用流的方式保存就可以,很简单的,下面是代码: //MyPic为定义的变量 MyPic:=TMemoryStream.Create; if img1.Picture.Graphic <> nil then begin img1.Picture.Graphic.SaveToStream(MyPic); //将img控件内的图片保存的变量中 end; //下面是新增的方式,如果是修改可以将qry1.Append 换成 qry1.Edit qry1.Append; TBlobField(qry1.FieldByName('图片')).LoadFromStream(MyPic); //将变量中的流数据保存到数据库图片字段中 qry1.Post;
sixgj 2020-06-24
  • 打赏
  • 举报
回复
就是图片变数据存
  • 打赏
  • 举报
回复
用BLOB类型字段即可
xrbaa 2020-06-19
  • 打赏
  • 举报
回复
引用 10 楼 LionGod 的回复:
无非就是将图片变成base64字符串存入数据库吗?

这个方案也可以,base64编码后的长度比原来会大很多,前面的几种方案都是直接保存二进制的图片文件。
xrbaa 2020-06-18
  • 打赏
  • 举报
回复
引用 6 楼 tanqth 的回复:
[quote=引用 5 楼 ZgxY 的回复:]
[quote=引用 1 楼 xrbaa的回复:]这个是我项目中的源代码:
// 保存图片
procedure TfrmSetPrintFormat.SaveImage();
var
Stream:TMemoryStream;
begin
if imgTicket.Picture.Width = 0 then
// 无图
Exit;
Stream := TMemoryStream.Create; // 创建内存流
case intPictureType of
1:
imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
2:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
0:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
end;

imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
qSet.Close;
qSet.Parameters.Clear;
qSet.SQL.Clear;
qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' +
IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID));
qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 读取保存的内存图
qSet.ExecSQL;
Stream.Free; // 释放内存流
end;
// 加载图片
procedure TfrmSetPrintFormat.LoadImage;
var
Stream:TMemoryStream;
Jpg:TjpegImage;
png:TPngImage;
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
// 读图片类型
intPictureType := qSet.FieldByName('PhotoType').AsInteger;
// 加载图片
Stream := TMemoryStream.Create ;
TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 显示的转换为BlobField并保存到内存流
Stream.Position :=0;
case intPictureType of
1:
begin
Jpg := TjpegImage.Create ;
Jpg.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Graphic.Assign(Jpg);
Jpg.Free;
end;
2:
begin
png := TPngImage.Create ;
png.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Bitmap.Assign(Png);
png.Free;
end;
0:
imgTicket.Picture.Bitmap.LoadFromStream(Stream);
else
imgTicket.Picture := nil;
end;
Stream.Free;
end
else
begin
imgTicket.Picture := nil;
end;
end;

看不懂 我现在做一个题 需要在表里支持照片流存入
类似于员工表插入个人信息照片那种 有啥简单点的方法吗?[/quote]

他给你的就是简单的方法了,只是他使用了三种图片类型,你可以只使用其中一种。
这个代码里,既有保存图片到数据库,又有从数据库读取图片出来,你直接复制,使用SQL代码就可以了。[/quote]
就是,已经够简单了。
LionGod 2020-06-18
  • 打赏
  • 举报
回复 1
无非就是将图片变成base64字符串存入数据库吗?
victor_yang 2020-06-16
  • 打赏
  • 举报
回复
这是我N年前框架里的代码,多个系统都在用,代码可能没有优化,反正可以用
victor_yang 2020-06-16
  • 打赏
  • 举报
回复

procedure TForm1.ShowPic;
var
vStr:TADOBlobStream;
vTmp,vTmp1,vPicType:string;
vtmpPath:PChar;
begin
Image1.Image.Graphic:=nil;//清空图像控件里的图像
vstr:=TADOBlobStream.Create(TBlobField(QueryDetail.FieldByName('Pic')),bmRead); //创建BlobStream,设定Pics字段为Blob字段,并设为只读
if vstr.Size=0 then //Stream的大小为0说明没有图像,退出
begin
exit;
end;
vPicType:=CheckImgType(vStr); //判断图像类型
vstr.Position:=0; //指针移动到开头
GetMem(vtmpPath,MAX_PATH); //获取临时目录
GetTempPath(MAX_PATH,vtmpPath);//获取临时目录
vTmp:=StrPas(vtmpPath); //获取临时目录
FreeMem(vtmpPath);//释放变量
vTmp:=vTmp + PubData1.GetGUIDString + '.' + vPicType; //将临时目录和文件名合成全路径文件名
TBlobField(QueryDetail.FieldByName('Pic')).SaveToFile(vTmp); //从Blob字段读取图像数据保存到临时文件
while not FileExists(vTmp) do
begin
Sleep(100);
Application.ProcessMessages;
end;
Image1.Picture.LoadFromFile(vTmp); //图像控件读取临时文件
DeleteFile(vTmp); //删除临时文件
end;

function TForm1.CheckImgType(Stream:TStream):String;
var
Buffer:Word;
i:integer;
begin
try
Stream.Position := 0; //移动指针到最开头的位置
if Stream.Size = 0 then //如果文件大小等于0,那么
begin
Result:='';
Exit;
end;
Stream.ReadBuffer(Buffer,2); //读取文件的前2个字节,放到Buffer里面
if Buffer=$4D42 then //如果前两个字节是以4D42[低位到高位]
Result:='BMP' //那么这个是BMP格式的文件
else if Buffer=$D8FF then //如果前两个字节是以D8FF[低位到高位]
Result:='JPEG' //........一样 下面不注释了
else if Buffer=$4947 then
Result:='GIF'
else if Buffer=$050A then
Result:='PCX'
else if Buffer=$5089 then
Result:='PNG'
else if Buffer=$4238 then
Result:='PSD'
else if Buffer=$A659 then
Result:='RAS'
else if Buffer=$DA01 then
Result:='SGI'
else if Buffer=$4949 then
Result:='TIFF'
else //如是其他类型的文件的话,直接显示错误
Result:='';
except
Result:='Err';
end;

procedure TForm1.ActionAddPicExecute(Sender: TObject);
begin
inherited;
if not QueryDetail.Active then
Exit;
with OpenPictureDialog1 do
begin
if not Execute then Exit;
Image1.Picture.Graphic:=nil;
Image1.Picture.LoadFromFile(FileName);//加载图片
QueryDetail.Edit;
TBlobField(QueryDetail.FieldByName('Pic')).LoadFromFile(FileName);//重点这里,Image类型字段加入文件
QueryDetail.Post;
end;

end;



读取文件用了流,保存照片太简单就直接文件操作了。
tanqth 2020-06-13
  • 打赏
  • 举报
回复
引用 5 楼 ZgxY 的回复:
[quote=引用 1 楼 xrbaa的回复:]这个是我项目中的源代码: // 保存图片 procedure TfrmSetPrintFormat.SaveImage(); var Stream:TMemoryStream; begin if imgTicket.Picture.Width = 0 then // 无图 Exit; Stream := TMemoryStream.Create; // 创建内存流 case intPictureType of 1: imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中 2: imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中 0: imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中 end; imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中 qSet.Close; qSet.Parameters.Clear; qSet.SQL.Clear; qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' + IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID)); qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 读取保存的内存图 qSet.ExecSQL; Stream.Free; // 释放内存流 end; // 加载图片 procedure TfrmSetPrintFormat.LoadImage; var Stream:TMemoryStream; Jpg:TjpegImage; png:TPngImage; begin if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then Exit; if qSet.Eof then Exit; if not qSet.FieldByName('Photo').IsNull then begin // 读图片类型 intPictureType := qSet.FieldByName('PhotoType').AsInteger; // 加载图片 Stream := TMemoryStream.Create ; TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 显示的转换为BlobField并保存到内存流 Stream.Position :=0; case intPictureType of 1: begin Jpg := TjpegImage.Create ; Jpg.LoadFromStream(Stream); // 加载图片 imgTicket.Picture.Graphic.Assign(Jpg); Jpg.Free; end; 2: begin png := TPngImage.Create ; png.LoadFromStream(Stream); // 加载图片 imgTicket.Picture.Bitmap.Assign(Png); png.Free; end; 0: imgTicket.Picture.Bitmap.LoadFromStream(Stream); else imgTicket.Picture := nil; end; Stream.Free; end else begin imgTicket.Picture := nil; end; end;
看不懂 我现在做一个题 需要在表里支持照片流存入 类似于员工表插入个人信息照片那种 有啥简单点的方法吗?[/quote] 他给你的就是简单的方法了,只是他使用了三种图片类型,你可以只使用其中一种。 这个代码里,既有保存图片到数据库,又有从数据库读取图片出来,你直接复制,使用SQL代码就可以了。
xrbaa 2020-06-12
  • 打赏
  • 举报
回复
是我自己写的函数:
// 打开SQL语句,成功返回True
function TfrmMain.OpenSQL(query:TADOQuery;strSQL:string):Boolean;
begin
Result := True;
query.Close;
query.SQL.Clear;
query.SQL.Add(strSQL);
try
query.Open;
except
Result := False;
end;
end;
ZgxY 2020-06-12
  • 打赏
  • 举报
回复
引用 1 楼 xrbaa的回复:
这个是我项目中的源代码:
// 保存图片
procedure TfrmSetPrintFormat.SaveImage();
var
Stream:TMemoryStream;
begin
if imgTicket.Picture.Width = 0 then
// 无图
Exit;
Stream := TMemoryStream.Create; // 创建内存流
case intPictureType of
1:
imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
2:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
0:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
end;

imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
qSet.Close;
qSet.Parameters.Clear;
qSet.SQL.Clear;
qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' +
IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID));
qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 读取保存的内存图
qSet.ExecSQL;
Stream.Free; // 释放内存流
end;
// 加载图片
procedure TfrmSetPrintFormat.LoadImage;
var
Stream:TMemoryStream;
Jpg:TjpegImage;
png:TPngImage;
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
// 读图片类型
intPictureType := qSet.FieldByName('PhotoType').AsInteger;
// 加载图片
Stream := TMemoryStream.Create ;
TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 显示的转换为BlobField并保存到内存流
Stream.Position :=0;
case intPictureType of
1:
begin
Jpg := TjpegImage.Create ;
Jpg.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Graphic.Assign(Jpg);
Jpg.Free;
end;
2:
begin
png := TPngImage.Create ;
png.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Bitmap.Assign(Png);
png.Free;
end;
0:
imgTicket.Picture.Bitmap.LoadFromStream(Stream);
else
imgTicket.Picture := nil;
end;
Stream.Free;
end
else
begin
imgTicket.Picture := nil;
end;
end;
看不懂 我现在做一个题 需要在表里支持照片流存入 类似于员工表插入个人信息照片那种 有啥简单点的方法吗?
秋天之落叶 2020-06-11
  • 打赏
  • 举报
回复
引用 1 楼 xrbaa 的回复:
这个是我项目中的源代码:
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
end;

请解释一下OpenSQL的用法,我查不到这个函数,谢谢
  • 打赏
  • 举报
回复
可能是他自己写的函数~~~
xrbaa 2020-06-10
  • 打赏
  • 举报
回复
这个是我项目中的源代码:
// 保存图片
procedure TfrmSetPrintFormat.SaveImage();
var
Stream:TMemoryStream;
begin
if imgTicket.Picture.Width = 0 then
// 无图
Exit;
Stream := TMemoryStream.Create; // 创建内存流
case intPictureType of
1:
imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
2:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
0:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 将图片保存到内存流中
end;

imgTicket.Picture.Graphic.SaveToStream(Stream); // 将图片保存到内存流中
qSet.Close;
qSet.Parameters.Clear;
qSet.SQL.Clear;
qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' +
IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID));
qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 读取保存的内存图
qSet.ExecSQL;
Stream.Free; // 释放内存流
end;
// 加载图片
procedure TfrmSetPrintFormat.LoadImage;
var
Stream:TMemoryStream;
Jpg:TjpegImage;
png:TPngImage;
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
// 读图片类型
intPictureType := qSet.FieldByName('PhotoType').AsInteger;
// 加载图片
Stream := TMemoryStream.Create ;
TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 显示的转换为BlobField并保存到内存流
Stream.Position :=0;
case intPictureType of
1:
begin
Jpg := TjpegImage.Create ;
Jpg.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Graphic.Assign(Jpg);
Jpg.Free;
end;
2:
begin
png := TPngImage.Create ;
png.LoadFromStream(Stream); // 加载图片
imgTicket.Picture.Bitmap.Assign(Png);
png.Free;
end;
0:
imgTicket.Picture.Bitmap.LoadFromStream(Stream);
else
imgTicket.Picture := nil;
end;
Stream.Free;
end
else
begin
imgTicket.Picture := nil;
end;
end;

2,497

社区成员

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

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