私はSELECT文を使用してADOQueryに結合されたDBGridを持っています。すべてのレコードの1つのフィールドを更新しますか?
すべてのレコードに対して1つのフィールドを更新したいとします。たとえば、テキストボックスにデータを入力すると、すべてのレコードのフィールド「名前」(例のみ)が変更されます。
私はSELECT文を使用してADOQueryに結合されたDBGridを持っています。すべてのレコードの1つのフィールドを更新しますか?
すべてのレコードに対して1つのフィールドを更新したいとします。たとえば、テキストボックスにデータを入力すると、すべてのレコードのフィールド「名前」(例のみ)が変更されます。
この目的のために、クエリを起動することができます。
"UPDATE table SET name = textBox.text"; の構文に従ってください。 where節がなくてもそのフィールドを変更するだけで、すべてのenteriesが変更されます。
私は自分のAdoqueryがselectコマンドでdbgridがそのテーブルを表示していて、このselectがいくつかのテーブル(1つのテーブルだけではない)に参加していると言っています – micheal
@micheal、selectは複数のテーブルの結合ですが、助けてください、イシャは正しいです。その後、グリッドを更新して更新することができます。 –
テーブルを結合した場合でも、フィールドは1つだけから来ます。より複雑な状況は、そのフィールドがUNIONから来る場合です。 –
SQL UPDATEステートメントを使用すると、すべてのレコードを一度に更新できます。
あなたが何らかの理由でSQLのUPDATEを使用して、ADOレコードセットを使用して更新をしたい、あなたはこのようなコードを書くことができる(またはできない)にしたくない場合は、次の
var
AField : TField;
begin
Assert(AdoQuery1.Active, 'Dataset is not active!');
try
AdoQuery1.DisableControls;
AField := AdoQuery1.FieldByName('MyFieldName');
AdoQuery1.First;
while not AdoQuery1.Eof do
begin
AdoQuery1.Edit;
AField.Value := Edit1.Text;
AdoQuery1.Post;
AdoQuery1.Next;
end;
finally
AdoQuery1.EnableControls;
end;
end;
FieldByNameをループの外に配置してください。ローカルのFieldオブジェクトに参照を格納し、それをループで使用します。私はこの時間を見て、再び生産コードに忍び込むのがうんざりです。 –
@Francois、はい、ループ内でFieldByNameを使用するとパフォーマンスが低下しますが、これは実動コードではありません。レコードを繰り返し処理する方法を知ってもらうために速く書きました。とにかく、あなたの要求も反映するように変更しました。 – vcldeveloper
ありがとうございます。私はこれを生産コードで何回見てきたのでしょうか、最初はここで収穫されたナゲットから想像することはできませんが、残っています... –
私のアドバイスあなたには、あなたの質問を精緻化することです。特定の問題に関係するすべての事柄を含めて、あなたの状況を説明するためのより良い努力をすることが望まれます。この場合、selectの性質(一部の選択結果セットはデータベース・レベルでのみ読み取られます)、データベースで実行するか、同じADOQueryコンポーネントを使用するかのようなものがあります。人々があなたを助けようとしている時間を投資(または浪費)したい場合は、最初にあなたの状況をこの人に理解させようとしばらく時間を投資すればよい。 – jachguate