再び質問をさせてください
Delphiで初歩的な練習プログラムを組んでいます
基礎的な、登録・更新・削除・検索の練習です(DBとしてACCESSを利用)
※DBとの連携には、TADOQueryコンポ−ネントを使用してます
デ−タの新規登録に際し、INSERT前に既に登録されているのかどうか?
入力したedit1.text が0件か?1件か?で判別させようと思い、以下の
SQL文を作ってみました(0件の時には後続でINSERT文を発行させます)
※※※※※※※※※※※※
Query1.sql.add('SELECT Count(*) AS rec_counter
FROM テ−ブル1
WHERE 列A ="'+ edit1.text + '"'' );
※※※※※※※※※※※※
Query1.ExecSQL ;での実行直後にShowMessage文でrec_counter
を表示させると、必ず列Aに存在するDATAをedit1.textで指定し
ていても、0件となります
(rec_counterは0を初期値として代入していました)
そこで、 rec_counterの初期値を1や2でも試したところ、実行
直後の ShowMessage文では、初期値のまま1や2で通過している
ことがわかりました
何が原因で、SQLが正しく実行されてないのでしょうか?
今回も相当初歩的な質問ですが、ご教授下さい
>Query1.ExecSQL ;
Query1.Open;
にしたら、どうなりますか?
あと、
>ShowMessage文でrec_counter
>を表示させると、必ず列Aに存在するDATAをedit1.textで指定し
>ていても、0件となります
>(rec_counterは0を初期値として代入していました)
この部分のソースコードは、どのように書いていますか?
あと、(どうでもよいことですが)
>今回も相当初歩的な質問ですが
“相当初歩的な質問”と書かれてますが、
初歩的な質問では、ないと思いますよ。
ExecSQLは、Insert,Update,Deleteなどのデータ操作文を実行する場合に使います。
Select文の場合は、ActiveかOpenを使い、結果を参照します。
もう少し、参照する部分のSorceを見せていただきたいですね。
>Delphi初心者
は止めましょう。
ご回答ありがとうございます
まずはigy様、「Query1.Open;」でも結果は同じでした
そしてigy様、HOta様、ShowMessage文でrec_counter・・・ですが
ソ−スは以下の感じです
※※※※※※※※※※※※
var
rec_counter : integer;
〜中略〜
begin
rec_counter := 0 ;
//
if edit1.Text='' then
begin
ShowMessage('空欄です!');
exit;
end
else
begin
Query1.sql.clear;
Query1.sql.add('SELECT Count(*) AS rec_counter
FROM テ−ブル1
Where 列A ="'+ edit1.text + '"'' );
try
try
//uery1.ExecSQL ;
Query1.Open;
if rec_counter = 0 then
begin
ShowMessage('Query1.sql = '+ Query1.sql.text);
ShowMessage('新規になります(既に存在しています)');
Query1.sql.clear;
Query1.close;
exit;
end
else
begin
Query1.sql.clear;
Query1.close;
end;
Except
ShowMessage('更新処理に失敗しました!');
Query1.sql.clear;
Query1.close;
exit;
end;
finally
Query1.sql.clear;
Query1.close;
end;
・・・こんな感じです
※※※※※※※※※※※※
(Delphi初心者改め中級者?)
すいません、入社時によく先輩から「どんな言語でも、登録・更新・
削除・検索は基本中の基本よ!・・・」以下省略、とよく怒られていた
のでどうしてもトラウマになっておりまして・・・
そのようなわけですので宜しく御願い致します
> Query1.Open;
> if rec_counter = 0 then
rec_counterに検索した値を取り出していないようですね。
選択後は、レコードセットに入っていますから、
rec_counter = Query1.FieldByName('rec_counter').AsInteger;
として、Fieldの値を取り出します。
取り出した値でないと、変数rec_counterにはレコードセットの内容は入りません。元の値のままです。
>Delphi初心者
>は止めましょう。
>Delphi初心者改め中級者?
も止めましょう。
どうして普通の名前が付けられないんでしょうか。
HOta様、ありがとうございます
Delphiでの、SQL文の取扱いについて初歩的な事がわかっておりませんでした
ご指摘の通り、
>rec_counter = Query1.FieldByName('rec_counter').AsInteger;
を入れると、レコ−ドセットからrec_counterに結果を返す事ができました
ExecSQL/Openの違いの件といい、お恥ずかしい限りです
TS様、失礼しました
指摘を短絡に考えてました
今後は「Alan Smithee」と名乗らせていただきます
ツイート | ![]() |