有没有办法在Delphi数据库网格中只更新/刷新一条记录?

t0ybt7op  于 2022-10-16  发布在  其他
关注(0)|答案(6)|浏览(357)

有可能吗?多么?

vtwuwzda

vtwuwzda1#

取决于您与DBGrid链接的数据集。TClientDataset可以。

z6psavjg

z6psavjg2#

如果TDBGrid连接到内存数据集,则可以。您将通过ID在数据库中查询所选记录,同时使用您获得的结果(在内存中)修改它(所选记录)。

nxowjjhe

nxowjjhe3#

DBGrid中的数据源的数据集是什么?
如果您正在使用ADOConnection,并使用ADOTable或ADOQuery作为数据集,则可以尝试以下脚本:

ADOTable1.close;
ADOTable1.open;

ADOQuery1.close;
ADOQuery1.open;

上面的那些脚本将刷新整个DBGrid。
据我所知,现在有办法刷新DBGrid中的一条记录。如果我说错了,请纠正我。:)

tf7tbtn2

tf7tbtn24#

您需要在刷新之前保存ID,然后通过将光标定位在旧记录中来定位相同的ID。就像这样:

procedure TForm1.refreshQuery;
var
   oldID: integer;
begin
   oldID :=query1Id_table.AsInteger;
   query1.Refresh;
   //or if refresh not works
   //query1.close;
   //query1.open;
   query1.Locate('Id_table',oldID,[]);
end;

或依赖于数据集,请查看此函数是否起作用:

query1.RefreshCurrentRow;
xpcnnkqh

xpcnnkqh5#

您可以使用输入框询问特定内容,获取值以查找要编辑的内容,然后使用定位功能进行查找,如果找到,则进行编辑并提交

Var
    sRegisterNo, sAnswer : string;
Begin
    sAnswer := Inputbox('Registerno', 'Enter the user registerNo you want to edit' , '' );

    With dmName do
    Begin
        sRegisterNo := tblMembers['RegisterNo'];

        If sRegisterNo.locate(sAnswer,  'sRegisterNo') =  True then
        Begin
            tblMembers.edit;
            // Use edits to give the new values 
            // Ex. EdtRegisterno.text := RE001;
            tblMembers.post
        End;
    End;
End;
kkih6yb8

kkih6yb86#

下面的代码可以在C++Builder中运行,所以一旦转换为Delphi,它就应该可以运行。您将看到对记录数量的测试,这是因为低于500条记录(来自我的数据库的测试),完全刷新实际上比只筛选到当前记录、刷新它、取消筛选然后定位原始记录更快。

int refreshDataSetRecord(TDataSet *DS, String PrimaryKeyFld, String srcVal)
 {
  int f = 0;
  try
   {
    if(DS->Active)
     {
      if(srcVal.Length() == 0)
       {srcVal = DS->FieldByName(PrimaryKeyFld)->AsString;}
      if((DS->Filtered) // means can't just re-filter    
       ||(DS->RecordCount < 500)) // test for quickest refresh method
       {
        DS->Refresh();
        f = 2;
       }
      else
       {
        DS->Filter = PrimaryKeyFld + " = '" + srcVal+"'";
        DS->Filtered = true;
        DS->Refresh();
        DS->Filtered = false;
        DS->Filter = "";
        f = 1;
       }    
      if(DS->FieldByName(PrimaryKeyFld)->AsString != srcVal)
       {
        TLocateOptions SearchOptns;
        SearchOptns.Clear();
        DS->Locate(PrimaryKeyFld, srcVal, SearchOptns);
       }
     }
   }
  catch(Exception &e)
   {
    f = -1;
    MessageDlg("Problem refreshing DataSet record(" + DS->Name+"," + 
      PrimaryKeyFld + ")\n" + e.Message, mtError, TMsgDlgButtons() << mbOK, 0);
   }
  catch(...)
   {
    f = -1;
    MessageDlg("Undisclosed problem refreshing DataSet record(" + DS->Name + "," 
      + PrimaryKeyFld + ")", mtError, TMsgDlgButtons() << mbOK, 0);
   }
  return f;
 }

相关问题