在SQL Server数据库表中存储ttreeview

发布于 2025-01-22 21:02:33 字数 650 浏览 0 评论 0原文

我正在尝试通过使用下一个过程来存储我的ttreeview在SQL Server数据库表中:

procedure Save;
var
  BlobField :TBlobField;
  Query:TADOQuery;
  Stream:TStream;
begin
  Stream := TMemoryStream.Create;
  Query := TADOQuery.Create(Self);
  Query.SQL.Add('Select * From MyTable') ;
  Query.Active := True;
  Query.First;
  Query.Edit;
  BlobField := Query.FieldByName('MyTableField') as TBlobField;
  Stream := Query.CreateBlobStream(BlobField, bmWrite);
  TreeView1.SaveToStream(Stream);
  Query.Refresh;
  Query.Free;
  Stream.Free;
end; 

但是每次我收到错误时:DataSet不在编辑或插入模式中。

我正在使用Delphi 10.1,Win 10,SQL Server 2019。

Am trying to store my TTreeView inside SQL Server database table by using the next procedure:

procedure Save;
var
  BlobField :TBlobField;
  Query:TADOQuery;
  Stream:TStream;
begin
  Stream := TMemoryStream.Create;
  Query := TADOQuery.Create(Self);
  Query.SQL.Add('Select * From MyTable') ;
  Query.Active := True;
  Query.First;
  Query.Edit;
  BlobField := Query.FieldByName('MyTableField') as TBlobField;
  Stream := Query.CreateBlobStream(BlobField, bmWrite);
  TreeView1.SaveToStream(Stream);
  Query.Refresh;
  Query.Free;
  Stream.Free;
end; 

But every time I am getting the error: DataSet is not in edit or insert mode.

I'm using Delphi 10.1, Win 10, SQL server 2019.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜中书 2025-01-29 21:02:33

更改query.refresh; to query.post;

另外,您需要免费 blob流才能在blob字段中敲定写作,然后再进行blob字段。 发布将新数据提交到数据库中。

另外,您正在泄露未使用的tmemorystream对象。

尝试以下操作:

procedure Save;
var
  BlobField: TField;
  Query: TADOQuery;
  Stream: TStream;
begin
  Query := TADOQuery.Create(nil);
  try
    Query.SQL.Text := 'Select TOP(1) * From MyTable';
    Query.Open;
    try
      Query.First;
      Query.Edit;
      try
        BlobField := Query.FieldByName('MyTableField');
        Stream := Query.CreateBlobStream(BlobField, bmWrite);
        try
          TreeView1.SaveToStream(Stream);
        finally
          Stream.Free;
        end;
        Query.Post;
      except
        Query.Cancel;
        raise;
      end;
    finally
      Query.Close;
    end;
  finally
    Query.Free;
  end;
end; 

Change Query.Refresh; to Query.Post;

Also, you need to Free the blob stream to finalize writing to the blob field before you then Post to commit the new data into the DB.

Also, you are leaking an unused TMemoryStream object.

Try this:

procedure Save;
var
  BlobField: TField;
  Query: TADOQuery;
  Stream: TStream;
begin
  Query := TADOQuery.Create(nil);
  try
    Query.SQL.Text := 'Select TOP(1) * From MyTable';
    Query.Open;
    try
      Query.First;
      Query.Edit;
      try
        BlobField := Query.FieldByName('MyTableField');
        Stream := Query.CreateBlobStream(BlobField, bmWrite);
        try
          TreeView1.SaveToStream(Stream);
        finally
          Stream.Free;
        end;
        Query.Post;
      except
        Query.Cancel;
        raise;
      end;
    finally
      Query.Close;
    end;
  finally
    Query.Free;
  end;
end; 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文