天天看點

DELPHI中對SQL SERVER中image、text字段的讀寫綜述

下面通過詳細的例子來講述如何在delphi中處理sql server中的image、text字段。因為實際開發的需要, 我們需要處理的是text類型的字段,包括讀和寫。網上很多相關的文章都是講述的對image的讀寫操作,下面首先介紹如何将圖象存儲在sql server的image字段。

其中 DataMConn為一個針對資料庫操作的單元,放置一個ADOConnection,一個ADOQuery

//image to database

procedure TfrmText.Button1Click(Sender: TObject);

var

  bm:tbitmap;

  ms:TMemoryStream;

begin

  ms:=TMemoryStream.Create;      

  bm:=TBitmap.Create;

  bm.Assign(image1.Picture.Bitmap);

  bm.SaveToStream(ms);

  with DataMConn.ADOQHistory do

    begin

      Close;

      SQL.Clear;

      SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');

      Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);

      Parameters.ParamByName('x').Value   :=  'aaaaa';

      ExecSQL;

   end;

end;

//show image

procedure TfrmText.Button2Click(Sender: TObject);

    Stream:TStream;

    bm:tbitmap;

      with DataMConn.ADOQHistory do

        begin

          Close;

          SQL.Clear;

          SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');

          Try

            Open;

            stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);

            bm:=TBitmap.Create;

            bm.LoadFromStream(stream);

            image2.Picture.bitmap.Assign(bm);

            stream.Free;

          except

            begin

              ShowMessage('Error!');

              Exit;

            end;

          end;//try

        end;

下面的兩個例子是如何處理text類型的字段,其中讀取的時候,利用了一個TDBMemo控件,來加載讀取的流資料,然後指派給一個WideString類型的變量str

//text to stream

procedure TfrmText.Button3Click(Sender: TObject);

  str : WideString;

  ss:TStringStream;

  i : integer;

  str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';          

  for i := 1 to 10000 do

      str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';    //43萬多個位元組

    end;

  str := str + 'E';

  ss := TStringStream.Create(str);         

  //bm:=TBitmap.Create;

  //bm.Assign(image1.Picture.Bitmap);

  //bm.SaveToStream(ms);

      SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');

      Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);

//read text  to a TDBMemo

procedure TfrmText.Button4Click(Sender: TObject);

  stream : TStream;

  str : WideString;

   begin

    Close;

    SQL.Clear;

    SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');

    Open;

    if not IsEmpty then

      begin

        Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);

        stream.Position := 0;

        AMemo.Lines.LoadFromStream(stream);

        stream.Free;

      end;

//下面是把text字段的資料内容直接讀到一個WideString中,而不通過TDBMemo,因為在實際中,不知道何種原因,線程讀到資料後,隻能在第一次處理時正常,然後再用滑鼠點應用程式,程式就停了……who knows the reason , pls tell me & 3ks

procedure TfrmText.Button5Click(Sender: TObject);

  Buffer: PChar;

  MemSize: Integer;

  Stream: TStream;

      try

        MemSize := Stream.Size;

        Inc(MemSize);                   //Make room for the buffer's null terminator.

        Buffer := AllocMem(MemSize);     //Allocate the memory.

        try

          Stream.Read(Buffer^, MemSize);  //Read TempPackage field into buffer.

          str := Buffer;

        finally

          FreeMem(Buffer, MemSize);

      finally

        Stream.Free;

本文轉自 august 51CTO部落格,原文連結:http://blog.51cto.com/august/6906,如需轉載請自行聯系原作者