我在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从中获取数据。 现在我得到:绝对引擎错误:表被锁定。
答案 0 :(得分:1)
从所有代码行的开头删除DataModule3
。
您在类的方法中使用实例变量。如果实例的名称不是DataModule3
或DataModule3
之外的任何其他名称,则代码将失败。
编写代码的正确方法是(参见下面的注意):
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;
备注强>
Self
是可选的。您可以在没有Self.
的情况下编写每个,并且在这种情况下它也可以同样有效。 Self
指的是对象的当前实例,而不是像DataModule3
这样的特定命名实例。
您应该找到一种方法来删除对MainForm
和可视组件的引用,方法是将实例变量或属性添加到datamodule类,而不是在代码中引用。 MainForm
中的硬编码可能导致与DataModule3
中的硬编码相同的问题 - 它是一个特定的实例名称,而不仅仅是某个事物的当前实例。如果您将MainForm
重命名为其他内容,则代码将无法编译。如果您使用其他表单替换MainForm
,但尚未创建范围内的另一个MainForm
,您的代码也会崩溃。