今更ですが、SQLを勉強しながらQueryを使ったデータベースを使いたいんですが、自己解決できないので教えてください。
今までTableから1レコードを読み込む場合、
with Table do
begin
Open;
First;
if FindKey([Edit1.text]) then
begin
Edit2.Text := FieldByName('Si').AsString;
Edit3.Text := FieldByName('Mei').AsString;
end;
Close;
end;
としてきたんですが、
Query.SQL.Clear;
Query.SQL.Add('SELECT *');
Query.SQL.Add('FROM ADDRESS.DB');
Query.SQL.Add('WHERE Code =' + Edit1.Text);//←ここがわからない
Query.Open;
Edit2.Text := Query.FieldByName('Si').AsString;
Edit3.Text := Query.FieldByName('Mei').AsString;
Query.Close;
とすると「式中の型が一致していません」と出ます。
キーは"Code"という名の文字列なんですが。
>Query.SQL.Add('WHERE Code =' + Edit1.Text);//←ここがわからない
Query.SQL.Add('WHERE Code =' + '''' + Edit1.Text + '''');
でどうですか?
SQL文に検索条件をWhere句に書きます。
サンプーの書き方のほかに、Parametersで指定する方法もあります。
where Code = :Code
とすると、:の後ろがParameterになります。
paramByName('Code').asString := Edit1.Text
とします。
とりあえず、ダブルクォーテーションで挟むやり方にしました。
ParamByNameもいずれ使うと思うので覚えておきます。
もうひとつだけいいですか?
逆の追加の方なんですが、こっちが全くわかりません。
with Table do
begin
Open;
if not FindKey([Edit1.Text]) then
Insert
else
Edit;
FieldByName('SI').AsString := Edit2.text;
FieldByName('Mei').AsString := Edit3.Text;
Post;
Close;
end;
これで終わりにしますのでどうかよろしく御願いします。
Order By などがない場合です。あった場合は、TUpdateSQLを使います。
with QUery1 do
begin
if Locate('Code',VarArrayOf([Edit1.Text],[]) then
Edit
else begin
Append;
FieldByName('Code').asString := Edit1.Text;
end;
FieldByName('SI').AsString := Edit2.text;
FieldByName('Mei').AsString := Edit3.Text;
Try
Post;
except
Cancel;
End;
end;
?
RequestLive=True
どこかでエラーになるワケですか?
ありがとうございます。
TUpDateSQLは使ってませんが、LocateとRequestLiveどっちのでも上手くいきました。
ところでLocateとRequestLiveはどっち使っても問題はないんですか?
読み込みの時のSQLがそのまま使えるので、RequestLiveがいいなぁとは思ってるんですが。
すいません。ウソでした(>_<)
古いTableロジック通ってました。
差し替えたところ、
RequestLiveの方で、
書き込み禁止のデータは変更できません
となります。
読み込みの時のSQLはそのまま使えますよ。Orderや、複数テーブルからの読込の場合には、TUpdateSQLを使います。
LocateとRequestLiveは別のものです。
Helpは調べていますか?
TTableもTQueryもTDataSetからの派生したものです。
ですから、TDataSetのLocateはどちらも同じように使えます。
本業が忙しいのでなかなかゆっくり勉強できないんですが、
TQueryの
Cashedupdates := False;
RequestLive := True
の状態で追加・更新が可能ということはわかりました。
HOtaさんの例
if Locate('Code',VarArrayOf([Edit1.Text],[]) then
を実記
if qryCompany.Locate('Code',edtCode.Text,[]) then
としたことで、カーソルが移動したけどモードが変更不能になってたようです。
if qryCompany.Locate('Code',VarArrayOf([edtCode]).Text,[]) then
でうまく更新できました。
お騒がせしました。
ツイート | ![]() |