如何把图像(bmp或jpg)存入SQL SERVER?能否提供一点代码?(20分)

  • 主题发起人 主题发起人 峻祁连
  • 开始时间 开始时间

峻祁连

Unregistered / Unconfirmed
GUEST, unregistred user!
如何把图像(bmp或jpg)存入SQL SERVER?能否提供一点代码?

我看到好多数据库都可以存储OLE对象的,比如图片什么的,所以也想自己弄个数据库里面
存储图像,比如员工的照片,可我怎么把这些图像放到数据库里呢?
有必要了解图像的数据格式吗?

哪位大侠能提供一个简单的方法 或 代码。
 
论坛上此类问题已经很多,你找一找即可
 
var fld:TField;

fld:=CurTable.FieldByName('PictureData');
CurTable.edit;
with(fld as tblobfield)do loadfromfile(edit1.Text); //输入
with(fld as tblobfield)do savetofile(fileName); //输出
 
强烈建议你之间把图片统一存到一个目录下,然后数据库存路径就可以了,这样既方便,又快。
对数据库要求也不高。
 
我不想用文件系统的,太乱。
存储bmp格式的没问题,jpg的和gif等其它格式的还不行,
谁还作过的这类东西。还有在ACCESS和SQL SERVER下是一样的吗?
 
代码:
昨天写的Access的,把那个字段类型。。那里改改就行

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, ADODB, StdCtrls, DBCtrls, ExtCtrls;

type
  TfrmTestAccessImge = class(TForm)
    ADOQuery1: TADOQuery;
    btnWrite: TButton;
    DBImage1: TDBImage;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    btnRead: TButton;
    procedure btnWriteClick(Sender: TObject);
    procedure btnReadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmTestAccessImge: TfrmTestAccessImge;

implementation

{$R *.DFM}

procedure TfrmTestAccessImge.btnWriteClick(Sender: TObject);
var
  msFileData: TMemoryStream;
begin
  msFileData := TMemoryStream.Create;
  msFileData.LoadFromFile('c:/line.bmp');
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('insert into mytable (myole) values (:myparameter)');
    Parameters.ParamByName('myparameter').LoadFromStream(msFileData,
      ftDBaseOle); [blue]//这里可能要改改[/blue]
    ExecSQL;
    Close;
  end;
  msFileData.Free;
end;

procedure TfrmTestAccessImge.btnReadClick(Sender: TObject);
var
  msFileData: TMemoryStream;
begin
  msFileData := TMemoryStream.Create;
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select myole from mytable');
    Open;
    Fields[0].SetFieldType(ftDBaseOle);
    TBlobField(Fields[0]).SaveToStream(msFileData);
    //    有一个DBImage控件在窗体上
    //    msFileData.SaveToFile('c:/ab.bmp');
  end;
  msFileData.Free;
end;

end.
 
给你一段绝对可用的代码,已在实际应用中使用过,用来上传指定的任意
文件到SQL Server中某个表的image字段:

procedure SaveFileToServer(const AFilename: String);
var
h: THandle;
file_size, read_bytes: Cardinal;
v: Variant;
p: Pointer;
begin
//打开文件
h := CreateFile(PChar(AFilename), GENERIC_READ
,FILE_SHARE_READ, nil, OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL, 0);
if h = INVALID_HANDLE_VALUE then
raise Exception.Create('打开文件失败');
try
//取文件长度
file_size := GetFileSize(h, nil);
//建立一个可变数组,容量正好与文件长度一致
v := VarArrayCreate([0,file_size-1], varByte);
//锁定数组以便直接存取
p := VarArrayLock(v);
try
//读入文件
if (not ReadFile(h, p^, file_size, read_bytes, nil))
or (read_bytes<>file_size) then
raise Exception.Create('读文件失败');
finally
//记住对数组解锁
VarArrayUnlock(v);
end;
finally
//还要记住关闭文件
CloseHandle(h);
end;
//现在数据都在V里面了,可以直接赋给ADOCommand或是
//TStoredProc控件的Param,以ADDCommand为例,设你的
//SQL服务器有一个名为upload的存诸过程,其中有一个
//参数就是上传的二进制数据(在SQL Server中类型可以
//为image或varbinary),那么你只需把V赋值给参数就行
ADOCommand1.Parameters.ParamByName('@data').Value := v;
ADOCommand1.Execute;
//打完收工
end;

在实际的运用中,我还利用ZLib把文件数据先压缩后再上传,
效果更好
 
谢谢NoSound的经典代码,我收藏了。。。呵呵~~~~~~~~~~~~~~~~相比之下,惭愧有加~
 
多人接受答案了。
 
后退
顶部