使用dbgrid更新多行

时间:2017-12-05 02:19:50

标签: delphi oracle11g delphi-7 zeos

我是编码的新手,我现在正在制作一个简单的应用。

enter image description here

因此,您可以在图片中看到,我在所选日期中有多个数据。如果我想用不同的值更新每一行并使用保存按钮进行更新,我应该使用什么代码? 我的dbgrid在其属性上需要更多设置吗? 我使用Delphi 7和zeos作为数据库连接以及oracle作为db。提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用更新查询

select "Database"
Update "tablename" 
set "colonnename1"="new value, "colonnename1"="new value, ...
where "colonnename"=value

这是更新查询,使用delphi时可以这样做:

begin
uniquery1.clear;
Uniquery1.SQL.Add('update person set name ='''+edit1.Text+''',lastname='''+edit2.Text+''',age='+edit3.Text+',city='''+edit4.Text+''' where date=' + edit5.text);                                     
uniquery1.ExecSQL;
messagedlg('Successfully Modified!',mtinformation,[mbOK],0);
end;

或者你可以使用参数化方法,这比连接SQL更好[ NIL 表示:

begin
Uniquery1.sql.clear;
Uniquery1.SQL.Add('UPDATE person SET  "1colonnename"= ":parmID", name= :sal WHERE Num='+ inttostr(strtoint(dbgrid1.DataSource.DataSet.FieldValues['num'])));                             uniquery1.ParamByName('paramID').value:=edit1.text;
uniquery1.ParamByName('sal').Value:=edit2.text;
uniquery1.ExecSQL;
end;

这只是一个例子,但这是如何运作的! 祝你好运

答案 1 :(得分:0)

不同的方式取决于您想要什么以及您使用什么。

如果您希望将多行编辑到DBGrid中并同时保存它们,大多数数据集组件都支持CachedUpdate模式(有关详细信息,请查看Zeos文档)。在此模式下,数据集将保留所有更改,直到您调用ApplyUpdates方法将这些更改用于一个批处理的数据库。

使用Oracle,您可以在没有缓存更新的情况下执行此操作,只需使用“长事务”即可。在这种情况下,您应该在表单以常规方式打开,编辑和发布数据时启动事务,并在按下Save时提交它们。这种方式有一些缺点,但我怀疑你会遇到它们。

如果您希望在按Save按钮时进行某种质量更新,则有两种方法。首先,您可以设置查询组件,将其SQL属性设置为

update My_Table set My_Field_1 = :Value1, My_Field_2 = :Value2

并将其调用为保存操作处理程序:

qUpdate.Params.ParamByName('Value1').AsString := edFirstValue.Text;
qUpdate.Params.ParamByName('Value2').AsString := edSecondValue.Text;
qUpdate.ExecSQL;
qMain.Refresh; { we're in need to see updates values, yeah? }

否则,您可以从客户端执行此操作:

qMain.DisableControls;
try
  Bookmark := qMain.Bookmark;
  qMain.First;
  while not qMain.Eof do
  begin
    qMain.Edit;
    qMain.FieldByName('My_Field_1').AsString := edFirstValue.Text;
    qMain.FieldByName('My_Field_2').AsString := edSecondValue.Text;
    qMain.Post;
    qMain.Next;
  end;
finally
  qMain.Bookmark := Bookmark;
  qMain.EnableControls;
end;

通常,这不是那么好的方式,所以不要上瘾。