无法更新表格

时间:2014-06-11 18:00:17

标签: delphi

我在cxGrid中有一个布尔字段(表示为网格内的复选框)。 当用户将复选框设置为选中时,我正在尝试更新同一条记录。

我试过了:

procedure TDataModule3.ABSTable2BeforePost(DataSet: TDataSet);
begin
if DataModule3.ABSTable2.FieldByName('DONE').AsBoolean = True then
with Datamodule3.ABSQuery4 do begin
Datamodule3.ABSQuery4.Close;
Datamodule3.ABSQuery4.SQL.Clear;
Datamodule3.ABSQuery4.SQL.Text :='UPDATE MYTABLE SET USER=:a1 where TW_ID =:a2';
Datamodule3.ABSQuery4.Params.ParamByName('a1').AsString := MainForm.AdvOfficeStatusBar1.Panels[3].Text ;
Datamodule3.ABSQuery4.Params.ParamByName('a2').AsInteger := Datamodule3.ABSTable2.FieldByName('TW_ID').AsInteger;
Datamodule3.ABSQuery4.ExecSQL;
end;
end;

我得到: $ 00B6E33F的首次机会异常。异常类$ C0000005,在0x00b6e33f处有消息'访问冲突:读取地址0x000003a0'。处理Project1.exe(4916)

我做错了什么?

编辑:我尝试了这个建议。

/

if ABSTable2.FieldByName('Done').AsBoolean = True then
  begin
  ABSQuery4.Close;
  ABSQuery4.SQL.Clear;
  ABSQuery4.SQL.Text :='UPDATE mytable SET user=:a1 where  TW_ID=:a2 ';
  ABSQuery4.Params.ParamByName('a1').AsString := ABSQuery1.FieldByName('USER').asString ;
  ABSQuery4.Params.ParamByName('a2').AsInteger := ABSTable2.FieldByName('TW_ID').AsInteger;
   ABSQuery4.ExecSQL;
  end;

我删除了对主窗体的引用,并添加了查询语法,如AdvOfficeStatusBar1.Panels [3] .Text从中获取数据。 现在我得到:绝对引擎错误:表被锁定。

1 个答案:

答案 0 :(得分:1)

从所有代码行的开头删除DataModule3

您在类的方法中使用实例变量。如果实例的名称不是DataModule3DataModule3之外的任何其他名称,则代码将失败。

编写代码的正确方法是(参见下面的注意):

procedure TDataModule3.ABSTable2BeforePost(DataSet: TDataSet);
begin
  if Self.ABSTable2.FieldByName('DONE').AsBoolean = True then
  begin
    Self.ABSQuery4.Close;
    Self.ABSQuery4.SQL.Clear;
    Self.ABSQuery4.SQL.Text :='UPDATE MYTABLE SET USER=:a1 where TW_ID =:a2';

    // See NOTE below
    Self.ABSQuery4.Params.ParamByName('a1').AsString := MainForm.AdvOfficeStatusBar1.Panels[3].Text ;
    Self.ABSQuery4.Params.ParamByName('a2').AsInteger :=    Self.ABSTable2.FieldByName('TW_ID').AsInteger;
    ABSQuery4.ExecSQL;
  end;
end;

备注

  1. Self是可选的。您可以在没有Self.的情况下编写每个,并且在这种情况下它也可以同样有效。 Self指的是对象的当前实例,而不是像DataModule3这样的特定命名实例。

  2. 您应该找到一种方法来删除对MainForm和可视组件的引用,方法是将实例变量或属性添加到datamodule类,而不是在代码中引用。 MainForm中的硬编码可能导致与DataModule3中的硬编码相同的问题 - 它是一个特定的实例名称,而不仅仅是某个事物的当前实例。如果您将MainForm重命名为其他内容,则代码将无法编译。如果您使用其他表单替换MainForm,但尚未创建范围内的另一个MainForm,您的代码也会崩溃。