为什么,如果通过变量将值添加到数据库,则添加“ ADOQuery1”,如果直接添加,则添加正确的值?

时间:2019-06-06 23:14:57

标签: delphi

有这样的代码。

procedure TForm1.FramePositionsAdd1ButtonAddClick(Sender: TObject);
var
  Name: String;
  begin
    Name := FramePositionsAdd1.EditName.Text;

    with FramePositionsAdd1.ADOQuery1 do
    begin;
      SQL.Clear;
      SQL.Text := 'INSERT INTO Должности ' +
      '(Наименование) ' +
      'VALUES ' +
      '(:title)';
      Parameters.ParamByName('title').Value := Name;
      ExecSQL;
    end;
end;

该值已添加到数据库,但是添加了字符串FramePositionsAdd1.EditName.Text而不是ADOQuery1。 我试图删除Name变量。一行更改:

Parameters.ParamByName('title').Value := FramePositionsAdd1.EditName.Text;

一切正常。有什么问题吗?

1 个答案:

答案 0 :(得分:8)

您使用with导致对Name的引用解析为AdoQuery1.Name而不是您的局部变量Name

with FramePOstitionsAdd1.AdoQuery1 do
begin
  // Name used here, because of the with, refers to the object in the
  // with statement and not the local variable declared outside the
  // with block.
end;

要么将变量名更改为其他名称,要么(更好)停止使用with,因为它可能会引起诸如此类的副作用。

procedure TForm1.FramePositionsAdd1ButtonAddClick(Sender: TObject);
var
  Title: String;
begin
  Title := FramePositionsAdd1.EditName.Text;

  with FramePositionsAdd1.ADOQuery1 do
  begin
    SQL.Clear;
    SQL.Text := 'INSERT INTO Должности ' +
      '(Наименование) ' +
      'VALUES ' +
      '(:title)';
    Parameters.ParamByName('title').Value := Title;
    ExecSQL;
  end;
end;

更好的解决方案,可以防止以后由于编辑而引起的相同性质的问题:

procedure TForm1.FramePositionsAdd1ButtonAddClick(Sender: TObject);
var
  Name: String
  Qry: TAdoQuery;
begin
  Name := FramePositionsAdd1.EditName.Text;
  // Get a local reference to your query
  Qry := FramePositionsAdd1.ADOQuery1;

  // Use that local reference
  Qry.SQL.Clear;
  Qry.SQL.Text := 'INSERT INTO Должности ' +
      '(Наименование) ' +
      'VALUES ' +
      '(:title)';
  Qry.Parameters.ParamByName('title').Value := Name;
  Qry.ExecSQL;
  // DO NOT free or nil Qry here. It is just a pointer to the original,
  // not a new object, and freeing it will free the original query instead.
end;