我在存储图片到sql server2k时出现"invaild blob length"错误,这是怎么回事?
我的代码如下:procedure TForm1.Button2Click(Sender: TObject);
var
 Filestream:Tfilestream;
begin
table1.Edit;
 opicdlg1.Execute;
 filestream:=tfilestream.Create(opicdlg1.FileName,fmopenRead);
 filestream.Position:=0;
 tblobfield(table1.Fields.FieldByName('相片')).LoadFromStream (filestream) ;
 table1.Post;
end;

解决方案 »

  1.   

    用Tmemorystream吧
    var
      strm : Tmemorystream;
    begin
      if fileexists(openpicturedialog1.FileName) then
      begin
      strm := Tmemorystream.Create;
      strm.LoadFromFile(openpicturedialog1.FileName);
      strm.Position := 0;
      with dm.ClassMateQuery do
      begin
        append;    
        TBlobfield(fieldbyname('pic')).LoadFromStream(strm);
        try
        post;
        showmessage('保存成功');     
        except
        showmessage('保存失败');
        end;
      end;
      strm.Free;
      end;
      

  2.   

    可能转换流的时候文件较大超过了大小,不太清楚,我是这样搞的
    procedure TForm1.Button19Click(Sender: TObject);
    var
      bmp : TImage;
      jpg : TJPEGImage;
      fn : string;
    begin
       bmp := TImage.Create(nil);
       jpg := TJPEGImage.Create;
       if  OpenDialog1.Execute then
        begin
         fn := Trim(OpenDialog1.FileName);
          if Not FileExists(fn) then
           begin
              exit;
           end
         else
           begin
             bmp.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
             jpg.Assign(bmp.Picture.Bitmap);
             jpg.SaveToFile(ChangeFileExt(OpenDialog1.FileName,'.jpg'));
             ADOTable1.Edit;
             ADOTable1.FieldByName('photo').Assign(jpg);
             ADOTable1.Post;
         end;
         end;end;
      

  3.   

    Query.Close;
      Query.SQL.Clear;
      Query.SQL.Add('INSERT INTO myimages(FileName,pic) VALUE(''Image1'',:pic)');
      Query.ParamByName('pic').LoadFromFile('D:\Hasd.bmp',ftBlob);
      Query.ExecSQL;
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,jpeg,
      ExtDlgs, Db, DBTables, StdCtrls, ExtCtrls, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        Button2: TButton;
        Image1: TImage;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        filename:string;
        procedure SetPicture(pos:string;TempQuery:TADOQuery);     /////往数据库中插入图片
        procedure GetPicture(pos:string;TempQuery:TADOQuery);      ////得到图片
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.GetPicture(pos:string;TempQuery: TADOQuery);
    var
      MS_JpegStream:TMemoryStream;
    begin
      try
        MS_JpegStream:=TMemoryStream.Create;
        with tempQuery do
          begin
            close;
            sql.clear;
            //修改这个语句
            sql.Add('select picture from table where no=:pos');
            Parameters.ParamByName('pos').value:=pos;
            Open;
          end;
        if tempquery.FieldByName('image').isnull then
          begin
            image1.Picture.Graphic:=nil;
          end
        else
          begin
             (tempQuery.FieldByName('image') as tblobfield).savetostream(MS_JpegStream);
             image1.Picture.Graphic:=nil;
             image1.Picture.Graphic:=TJpegImage.Create;
             MS_JpegStream.Position:=0;
             image1.Picture.Graphic.LoadFromStream(MS_JpegStream);
          end;  finally
        MS_JpegStream.Free;
      end;end;procedure TForm1.SetPicture(pos:string; TempQuery: TADOQuery);
    var
      MS_JpegStream:TMemoryStream;
      M_BitMap:TBitMap;
      M_Jpeg:TJpegImage;
    begin
      try
        MS_JpegStream:=TMemoryStream.Create;
        M_BitMap:=TBitMap.Create;
        M_Jpeg:=TJpegImage.Create;
        if extractfileext(filename)='.bmp' then
          begin
            M_BitMap.LoadFromFile(filename);
            M_Jpeg.Compress;
            M_Jpeg.Assign(M_BitMap);
          end
        else if extractfileext(filename)='.jpg' then
          begin
            M_Jpeg.LoadFromFile(filename);
          end;
        M_Jpeg.SaveToStream(MS_JpegStream);
        with tempQuery do
          begin
            close;
            sql.clear;
    //修改这个语句
            sql.Add('insert into table (no,IMage) values (:pos,:image)');
            Parameters.ParamByName('pos').Value:=pos;
            Parameters.ParamByName('image').LoadFromStream(MS_JpegStream,ftblob);        ExecSQL;
          end;
      finally
        MS_JpegStream.Free;
        M_BitMap.Free;
        M_Jpeg.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);//打开图片并写入数据库
    begin
      if openpicturedialog1.Execute then
      begin
       filename:=openpicturedialog1.FileName;
       SetPicture(edit1.text,ADOQuery1);
      end
    end;procedure TForm1.Button2Click(Sender: TObject);//显示图片
    begin
      getpicture(edit1.text,ADOQuery2);
    end;end.
      

  5.   

    http://community.csdn.net/Expert/topic/3101/3101376.xml?temp=3.071231E-02