1

資産番号がデータベースにあるかどうかを確認するクエリを実行すると、false が返されます。したがって、データを db に追加したいのですが、エラーは発生しません。しかし、データを追加することはありません。

  //check if its there, if so update it, if not add it.
if fdeptlayout.adoquery1.IsEmpty then
begin
  showmessage('adding new machine to db');
  with Fdeptlayout.ADOQuery1 do
    begin
    sql.Clear;
    sql.BeginUpdate;
    sql.add('INSERT INTO MList ');
    sql.Add('(Zone,Dept,Number,Name,Asset,IsPanel');
    sql.Add(',FinalLocation,Left,Top) ');
    sql.Add('VALUES ( :Zone, :Dept, :Number, :Name, :Asset, :IsPanel');
    sql.Add(', :FinalLocation, :Left, :Top)');
    sql.EndUpdate;
    Parameters.ParamByName('Zone').Value  := CZone;
    Parameters.ParamByName('Dept').Value  := CDept;
    Parameters.ParamByName('Number').Value := CNumber;
    Parameters.ParamByName('Name').Value  := CName;
    Parameters.ParamByName('Asset').Value := CAsset;
    Parameters.ParamByName('IsPanel').Value := CIsPanel;
    Parameters.ParamByName('FinalLocation').Value := CFinalLocation;
    Parameters.ParamByName('Left').Value := CLeft;
    Parameters.ParamByName('Top').Value := CTop;
    open;
4

2 に答える 2

10

adoquery1データの取得とコマンドの送信に使用しているようです。

それをしてはいけません。

追加の使用

開いているデータセットにデータを直接追加できます

with Fdeptlayout.ADOQuery1 do
begin
  // append a new row
  Append; 

  // set data to all fields
  FieldByName('Zone').Value := CZone;
  FieldByName('Dept').Value  := CDept;
  FieldByName('Number').Value := CNumber;
  FieldByName('Name').Value  := CName;
  FieldByName('Asset').Value := CAsset;
  FieldByName('IsPanel').Value := CIsPanel;
  FieldByName('FinalLocation').Value := CFinalLocation;
  FieldByName('Left').Value := CLeft;
  FieldByName('Top').Value := CTop;

  // post the new added data to the dataset
  Post; 
end;

SQL コマンドの使用

SQLコマンドを実行するには、クエリの別のインスタンスを使用する必要があります

with TADOQuery.Create( nil ) do
try
  // Prepare
  Connection := Fdeptlayout.ADOQuery1.Connection;

  sql.add('INSERT INTO MList ');
  sql.Add('(Zone,Dept,Number,Name,Asset,IsPanel');
  sql.Add(',FinalLocation,Left,Top) ');
  sql.Add('VALUES ( :Zone, :Dept, :Number, :Name, :Asset, :IsPanel');
  sql.Add(', :FinalLocation, :Left, :Top)');

  Parameters.ParamByName('Zone').Value  := CZone;
  Parameters.ParamByName('Dept').Value  := CDept;
  Parameters.ParamByName('Number').Value := CNumber;
  Parameters.ParamByName('Name').Value  := CName;
  Parameters.ParamByName('Asset').Value := CAsset;
  Parameters.ParamByName('IsPanel').Value := CIsPanel;
  Parameters.ParamByName('FinalLocation').Value := CFinalLocation;
  Parameters.ParamByName('Left').Value := CLeft;
  Parameters.ParamByName('Top').Value := CTop;

  // Execute the statement
  ExecSQL;

finally
  Free;
end;

// Update the data
Fdeptlayout.ADOQuery1.Refresh;
// or even better
Fdeptlayout.ADOQuery1.Requery;
于 2013-03-06T09:15:20.487 に答える
3

クエリを実行するのを忘れました:

sql.ExecSQL

Updateは、おそらくSelf.Update、つまりフォームの視覚的な更新として解釈されます。

于 2013-03-06T08:35:20.557 に答える