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);
var
    Stream:TStream;
    bm:tbitmap;
begin
      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;
end;
下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str
//text to stream
procedure TfrmText.Button3Click(Sender: TObject);
var
  str : WideString;
  ss:TStringStream;
  i : integer;
begin
  str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';          
  for i := 1 to 10000 do
    begin
      str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';    //43万多个字节
    end;
  str := str + 'E';
  ss := TStringStream.Create(str);         
  //bm:=TBitmap.Create;
  //bm.Assign(image1.Picture.Bitmap);
  //bm.SaveToStream(ms);
  with DataMConn.ADOQHistory do
    begin
      Close;
      SQL.Clear;
      SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');
      Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);
      Parameters.ParamByName('x').Value   :=  'aaaaa';
      ExecSQL;
   end;
end;

//read text  to a TDBMemo
procedure TfrmText.Button4Click(Sender: TObject);
var
  stream : TStream;
  str : WideString;
begin
  with DataMConn.ADOQHistory do
   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;
   end;
end;
//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ks
procedure TfrmText.Button5Click(Sender: TObject);
var
  Buffer: PChar;
  MemSize: Integer;
  Stream: TStream;
  str : WideString;
begin
  with DataMConn.ADOQHistory do
   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);
      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);
        end;
      finally
        Stream.Free;
      end;
    end;
   end;
end;


本文转自 august 51CTO博客,原文链接:http://blog.51cto.com/august/6906,如需转载请自行联系原作者
相关文章
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
1042 9
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
1112 5
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
4107 5
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
2140 1
sqlserver实现取相同名称放在同一字段
sqlserver实现取相同名称放在同一字段
246 3
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL Java Scala
flink-cdc SQL Server op 字段如何获取?
Flink CDC 是 Apache Flink 的组件,用于捕获数据库变更事件。对 SQL Server,通过 Debezium 连接器支持变更数据捕获。`op` 字段标识操作类型(INSERT、UPDATE、DELETE)。配置包括添加依赖及设定 Source 连接器,可通过 Flink SQL 或 Java/Scala 完成。示例查询利用 `op` 字段筛选处理变更事件。
951 1
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
957 0
|
SQL Oracle 关系型数据库
SQL添加字段记录详解:技巧与方法实践
在数据库管理中,经常需要向表中添加新的字段(列)或向现有字段中插入新的记录(行)
3320 0