TableからQueryへ移行したいんですが

解決


SQL初心者  2006-12-03 07:40:00  No: 24124

今更ですが、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"という名の文字列なんですが。


サンプー  2006-12-03 09:36:23  No: 24125

>Query.SQL.Add('WHERE Code =' + Edit1.Text);//←ここがわからない

Query.SQL.Add('WHERE Code =' + '''' + Edit1.Text + '''');

でどうですか?


HOta  2006-12-03 19:24:51  No: 24126

SQL文に検索条件をWhere句に書きます。
サンプーの書き方のほかに、Parametersで指定する方法もあります。
where  Code = :Code
とすると、:の後ろがParameterになります。
paramByName('Code').asString := Edit1.Text
とします。


SQL初心者+1  2006-12-03 20:22:37  No: 24127

とりあえず、ダブルクォーテーションで挟むやり方にしました。
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;

これで終わりにしますのでどうかよろしく御願いします。


HOta  2006-12-04 00:52:30  No: 24128

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;


ofZ  2006-12-04 19:42:37  No: 24129

? 
RequestLive=True


ofZ  2006-12-04 19:43:34  No: 24130

どこかでエラーになるワケですか?


SQL初心者+2  2006-12-04 21:26:52  No: 24131

ありがとうございます。
TUpDateSQLは使ってませんが、LocateとRequestLiveどっちのでも上手くいきました。
ところでLocateとRequestLiveはどっち使っても問題はないんですか?
読み込みの時のSQLがそのまま使えるので、RequestLiveがいいなぁとは思ってるんですが。


SQL初心者  2006-12-05 02:22:42  No: 24132

すいません。ウソでした(>_<)
古いTableロジック通ってました。
差し替えたところ、
RequestLiveの方で、
書き込み禁止のデータは変更できません
となります。


HOta  2006-12-05 05:50:31  No: 24133

読み込みの時のSQLはそのまま使えますよ。Orderや、複数テーブルからの読込の場合には、TUpdateSQLを使います。
LocateとRequestLiveは別のものです。
Helpは調べていますか?
TTableもTQueryもTDataSetからの派生したものです。
ですから、TDataSetのLocateはどちらも同じように使えます。


SQL初心者  2006-12-08 08:44:35  No: 24134

本業が忙しいのでなかなかゆっくり勉強できないんですが、
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
でうまく更新できました。
お騒がせしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加