DELPHI中对SQL SERVER中image、text字段的读写综述

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:
下面通过详细的例子来讲述如何在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语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
|
30天前
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
|
1月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
1月前
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
|
1月前
sqlserver实现取相同名称放在同一字段
sqlserver实现取相同名称放在同一字段
28 2
|
2月前
|
关系型数据库 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)")
|
2月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
173 0
|
3月前
|
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` 字段筛选处理变更事件。
134 1
|
3月前
|
SQL Oracle 关系型数据库
SQL添加字段记录详解:技巧与方法实践
在数据库管理中,经常需要向表中添加新的字段(列)或向现有字段中插入新的记录(行)
1148 0
|
3月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
470 0

热门文章

最新文章