如何存取图片到sql server图片格式最好是jpg的。

why_wf 2001-04-10 08:28:00
我用IMAGE控件,把图片转换成TSTREAM类,给QUERY.SQL,可是一执行,总是报错,我不想用TABLE和DBIMAGE这类数据感知控件,很不稳定。
...全文
269 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigroom 2001-04-19
  • 打赏
  • 举报
回复
关注
why_wf 2001-04-12
  • 打赏
  • 举报
回复
上面的程序有敲错的地方,大家在DELPHI里会自动给出的。
why_wf 2001-04-12
  • 打赏
  • 举报
回复
我已经解决问题,程序如下:
use jpeg
var
tp_stream: tmemorystream;
begin
tp_stream.create;
query1.close;
.........
image.picture.savetostream(tp_stream);
query1.parambyname(':变量名').loadstream:=tp_stream;
query1.sql.execsql;
query1.close;
end;
fengerfeifei 2001-04-10
  • 打赏
  • 举报
回复
可以式式
Query1.Params[n].ASBlob:=Buffer;

Query1.Params[n].LoadfromStream;
再不行就
Query1.Params[n].setBolbData;
应该都可以
注意要把
Query1.Params[n].DataType设成你的类型,比如ftBlob或ftGraphic



why_wf 2001-04-10
  • 打赏
  • 举报
回复
谢谢星星农场,不过你用的是TABLE控件,我特别说了,我不用TABLE控件,我用的是QUERY,我想知道为什么把TSTREAM类通过QUERY.PARAMABYNAME.LOADSTREAM装入后执行SQL就报错。
binghuodao 2001-04-10
  • 打赏
  • 举报
回复
用二进制方式打开文件,直接写入数据库,字段类型也是Image的。
Hank 2001-04-10
  • 打赏
  • 举报
回复
unit Ffactwin;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, StdCtrls, DBCtrls, DBGrids, DB, DBTables, Buttons, Grids, ExtCtrls,
Menus, ExtDlgs, Dialogs;

type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
DBLabel1: TDBText;
DBMemo1: TDBMemo;
DataSource1: TDataSource;
Table1: TTable;
Table1Common_Name: TStringField;
Table1Graphic: TBlobField;
DBGrid1: TDBGrid;
BitBtn1: TBitBtn;
Table1Category: TStringField;
Table1SpeciesName: TStringField;
Table1Lengthcm: TFloatField;
Table1Length_In: TFloatField;
Table1Notes: TMemoField;
ImageFish: TImage;
PopupMenuImage: TPopupMenu;
MenuImageLoad: TMenuItem;
N2: TMenuItem;
MenuImageConvertBitmap: TMenuItem;
MenuImageConvertGIF: TMenuItem;
MenuImageConvertJPEG: TMenuItem;
OpenPictureDialog: TOpenPictureDialog;
procedure DataSource1DataChange(Sender: TObject; Field: TField);
procedure MenuImageConvertBitmapClick(Sender: TObject);
procedure MenuImageConvertGIFClick(Sender: TObject);
procedure MenuImageConvertJPEGClick(Sender: TObject);
procedure MenuImageLoadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure UpdateField(Graphic: TGraphic);
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses
GIFImage,
JPEG,
ClipBrd;

{ Paradox graphic BLOB header - from db.pas }

type
TGraphicHeader = record
Count: Word; { Fixed at 1 }
HType: Word; { Fixed at $0100 }
Size: Longint; { Size not including header }
end;

TGraphicHack = class(TGraphic);
TGraphicHackClass = class of TGraphicHack;

TImageSignature = record
ImageType: TGraphicClass;
Name: string;
Signature: string;
end;

const
Signatures: array[0..2] of TImageSignature
= ((ImageType: TBitmap; Name: 'Bitmap'; Signature: 'BM'),
(ImageType: TGIFImage; Name: 'GIF'; Signature: 'GIF'),
(ImageType: TJPEGImage; Name: 'JPEG';
Signature: chr($FF)+chr($D8)+chr($FF)+chr($E0)+chr($00)+chr($10)+'JFIF'));

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
Stream : TStream;
Size : integer;
Header : TGraphicHeader;
Signature : pointer;
i : integer;
Image : TGraphic;
Name : string;
begin
if ((Field <> nil) and (Field <> Table1Graphic)) or
(Table1Graphic.DataSet.State <> dsBrowse) then
exit;

Image := nil;

// Database cursor has moved - Update image
Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmRead);
try
// Skip paradox image header
Size := Stream.Size;
if (Size >= SizeOf(TGraphicHeader)) then
begin
Stream.Read(Header, SizeOf(Header));
if (Header.Count <> 1) or (Header.HType <> $0100) or
(Header.Size <> Size - SizeOf(Header)) then
Stream.Seek(-SizeOf(Header), soFromCurrent);
end;

try
// Determine image type from file signature
for i := low(Signatures) to high(Signatures) do
begin
if (length(Signatures[i].Signature) > Size) then
continue;
// Read signature
GetMem(Signature, length(Signatures[i].Signature));
try
Stream.Read(Signature^, length(Signatures[i].Signature));
// Reposition stream cursor
Stream.Seek(-length(Signatures[i].Signature), soFromCurrent);
// Compare signatures
if (CompareMem(Signature, @Signatures[i].Signature[1], length(Signatures[i].Signature))) then
begin
Image := TGraphicHackClass(Signatures[i].ImageType).Create;
Name := Signatures[i].Name;
break;
end;
finally
Freemem(Signature);
end;
end;

// Force TImage to desired graphic type
ImageFish.Picture.Graphic := Image;

// Load image from stream
if (ImageFish.Picture.Graphic <> nil) then
begin
ImageFish.Picture.Graphic.LoadFromStream(Stream);
Caption := format('FISH FACTS - %s image, %d bytes', [Name, Size]);
end else
Caption := 'FISH FACTS';

finally
Image.Free;
end;
finally
Stream.Free;
end;
end;

// Write the specified image to the BLOB field
procedure TForm1.UpdateField(Graphic: TGraphic);
var
Stream : TStream;
Header : TGraphicHeader;
begin
Table1Graphic.DataSet.Edit;
Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmWrite);
try
// TBitmaps are saved in a special format which is compatible with
// the TDBImage component...
if (Graphic is TBitmap) and
((Table1Graphic.DataType = ftGraphic) or (Table1Graphic.DataType = ftTypedBinary)) then
begin
Stream.Write(Header, SizeOf(Header));
Graphic.SaveToStream(Stream);
Header.Count := 1;
Header.HType := $0100;
Header.Size := Stream.Position - SizeOf(Header);
Stream.Position := 0;
Stream.Write(Header, SizeOf(Header));
end else
// ...all other image formats are just saved to the BLOB stream
Graphic.SaveToStream(Stream);
finally
Stream.Free;
end;
Table1Graphic.DataSet.Refresh;
end;

procedure TForm1.MenuImageConvertBitmapClick(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(ImageFish.Picture.Graphic);
UpdateField(Bitmap);
finally
Bitmap.Free;
end;
end;

procedure TForm1.MenuImageConvertGIFClick(Sender: TObject);
var
GIF : TGIFImage;
begin
GIF := TGIFImage.Create;
try
GIF.ColorReduction := rmQuantize;
GIF.DitherMode := dmFloydSteinberg;
GIF.Assign(ImageFish.Picture.Graphic);
UpdateField(GIF);
finally
GIF.Free;
end;
end;

procedure TForm1.MenuImageConvertJPEGClick(Sender: TObject);
var
JPEG : TJPEGImage;
Bitmap : TBitmap;
begin
JPEG := TJPEGImage.Create;
try
// TJPEGImage can only assign from TBitmap and TJPEGImage, so we
// need to convert the TGIFImage to a TBitmap before it can be
// converted to a TJPEGImage
if (ImageFish.Picture.Graphic is TGIFImage) then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(ImageFish.Picture.Graphic);
JPEG.Assign(Bitmap);
finally
Bitmap.Free;
end;
end else
JPEG.Assign(ImageFish.Picture.Graphic);
JPEG.CompressionQuality := 80;
JPEG.Compress;
UpdateField(JPEG);
finally
JPEG.Free;
end;
end;

procedure TForm1.MenuImageLoadClick(Sender: TObject);
begin
if (OpenPictureDialog.Execute) then
begin
ImageFish.Picture.LoadFromFile(OpenPictureDialog.FileName);
UpdateField(ImageFish.Picture.Graphic);
end;
end;

end.
Hank 2001-04-10
  • 打赏
  • 举报
回复
用流来解决,然后判断流的起始标识符号,然后建立相应的显示图片的类,最后将图片转入到DBImage即可!
yhec 2001-04-10
  • 打赏
  • 举报
回复
DBIMage好象不能直接支持JPG格式?!
本课程根据讲师十多年在世界500强外企的生产环境中的SQL Serer数据库管理和项目实施经验倾心打造。课程系统性强,知识体系完整,覆盖90%以上的企业环境下SQL Server高可用场景,课程中不仅演示详细的操作步骤,更加突出最常见的故障和问题,让学员少走“弯路”,不只是让学员学会“操作”更能让学员“操作”的规范,满满的干货分享,一些课程资料(架构图、部署规划表格等)不仅可以帮助学员掌握技能,也可以作为学员在企业生产环境中实施SQL Server高可用的配置文档、操作手册等。课程的实验环境介绍:1)全部基于微软域环境和企业版SQL Server AOAG - 95%以上的企业环境都是在域环境中,不介绍非域环境和标准版的SQL Server高可用性组,这的配置在企业中较罕见,没有实践意义,不浪费学员时间。2)相应域环境已提前部署和配置好 - 学员导入虚拟机即可开始实验,无需从零开始搭建域环境,所有实验中SQL Server均已加域,直入主题,节省大量时间。3)最新的Windows Server故障转移集群(WS2016、WS2019)和最新版本的SQL ServerSQL2017、SQL2019) -  WS2016-SQL2017与WS2019-SQL2019是目前大多数企业SQL Server高可用的主要平台,基于微软产品生命周期现在一些企业也在讲早期的AOAG向这两个版本迁移,掌握这两种组合不仅让学员学会,更能学有所用。本课程为后续SQL Server进阶课程铺垫,是通向SQL Server DBA 专家的必经之路,讲师每周答疑两次。所有课程资料包括:课程PPT、架构图、部署规划表格、各类脚本学员均可下载。     

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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