Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 4317|回复: 4

如何将更新传回数据库

[复制链接]

该用户从未签到

发表于 2012-12-17 10:42:54 | 显示全部楼层 |阅读模式
将sqlquery的数据传到BUFDATASET中,方法如下:
procedure TFrmmain.GetData(bufdt: tbufdataset; sqlstr: string);
var
  sqlqry:tsqlquery;
  ms:TMemoryStream;
begin
  sqlqry:=tsqlquery.Create(nil);
  ms:=TMemoryStream.Create;
  try
    sqlqry.DataBase:=scon ;
    sqlqry.SQL.Clear;
    sqlqry.SQL.Text:=sqlstr;
    sqlqry.Open ;
    sqlqry.SaveToStream(ms);
    ms.Position:=0;
    bufdt.LoadFromStream(ms) ;
  finally
    sqlqry.Free;
    ms.Free ;
  end;
end;
   能够成功运行,然后可以对 tbufdataset的数据进行编辑,编辑完后再传回SQLQUERY,方法如下:
procedure TFrmmain.UpdateData(bufdt: tbufdataset; sqlstr: string);
var
  sqlqry:tsqlquery;
  ms:TMemoryStream;
begin
  sqlqry:=tsqlquery.Create(nil);
  ms:=TMemoryStream.Create;
  try
    sqlqry.DataBase:=scon ;
    //sqlqry.UpdateMode := upWhereAll;
    bufdt.SaveToStream(ms) ;
    ms.Position:=0;
    sqlqry.SQL.Text:=sqlstr;
    sqlqry.LoadFromStream(ms) ;
    edit1.Text:=inttostr(sqlqry.ChangeCount);
{
   sqlqry.ApplyUpdates ;
     sqltran2.Commit  ;
}   
  finally
    sqlqry.Free;
    ms.Free ;
  end;
end;
现在问题时,我能知道sqlqry有几条记录修改了,但怎么将它们传回后台数据库表中?

回复

使用道具 举报

该用户从未签到

发表于 2012-12-17 11:01:37 | 显示全部楼层
更新有两种:
1.update 语句
2.query.update方式
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-12-17 11:13:14 | 显示全部楼层
我说的更新不是SQLQUERY连接数据库后,sqlqry.ApplyUpdates 的更新。
而是让SQLQUERY接收到BUFDATASET的数据,再怎么写能传回到数据库,类似于DELPHI的Provider。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-12-17 14:12:07 | 显示全部楼层
本帖最后由 qqqqq 于 2012-12-17 16:09 编辑

找到的一些类似的问题
Do you really need a middle-tier layer on a separate machine?

You can use a TSQLQuery on the middle-tier machine, using a normal 'select * from table' connected to the db-server. You can use streams to connect this data to the end-tier, but you have to implement something to send this stream through a network yourself. On the end-tier you can also use a TSQLQuery, but do not open it using a query, but by assigning a stream (from the middle-tier) to it.

In theory this works, also with updates. But there's a lot that have to be done to make this all really work...
大致翻译一下:
可以用TSQLQuery的'select * from table'来打开数据表,以streams  格式传递数据(包括网络传递),在终端层也可以用TSQLQuery接收数据,再进行updates等操作。


我在设计三层结构时,想用TSQLQuery连接数据库后台,将数据以streams 形式传递到前台,用BUFDATASET接收,类似于DELPHI的CLIENTDATASET,在修改完成后,再以streams 的形式传回到后台TSQLQuery,现在问题是:TSQLQuery接收到数据如何更新到数据表,要象DELPHI有个TDataSetProvider就好了。

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-12-26 20:20:29 | 显示全部楼层
经过摸索,终于制成了我的三层架构,现在己将服务端封装成DLL,本地调用。就象上面说的,在DLL中用TSQLQuery连接数据库后台,将数据以streams 形式传递到前台,用BUFDATASET接收,在修改完成后,再根据UpdateStatus将变化后的数据打包成streams ,传递到后台DLL中,解析后更新回数据库,基本实现了三层结构。
但使用过程中发现BUFDATASET无法清空数据,再次LOADSTREAM到数据,内容没有变化,依然是第一次加载到的数据。我暂时都是动态使用BUFDATASET,用时创建,不用时释放,再次加载先释放再创建,绕一圈才能实现所要功能,以后再研究。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 21:43 , Processed in 0.069018 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表