SQLのフィールド挿入の際の変数の代入法について


Noby  2018-05-26 11:02:59  No: 49179  IP: 192.*.*.*

お世話になります。

以下の2点がよく判らず困っております。

いつも、初歩的な質問で恐縮です(^_^;)

1. ZQuery1.SQL.Text := 'INSERT INTO 内で変数の使用方法

なんとかSQLiteとDelphiを接続して、テーブルの作成および表示は
出来るようになりましたが、下記のEditテキストに入力した値を
データベースへ挿入する際の変数のセットの仕方がよく判りません。
色々ネットやヘルプを見ましたが・・・よく判りませんでした。

Edit1.text   Name
Edit2.text   Birth    
Edit3.Text   Addr

 ZQuery1.SQL.Text := 'INSERT INTO AddressTBL'
                    + '('
                    + '"氏名", "生年月日", "住所"'
                    + ')'
                    + ' VALUES ('
                    + '"山田太郎", "1995/01/22", "東京都品川区1-2-3"'
                    + ');';

上記は直接値を入力する場合ですが、変数をセットする場合は

どのようにするのでしょうか?


2.GRIDに表示されたレコード部分をクリックした時にその行(横一列)の上記のを取り出す際のイベントは何でしょうか?

編集 削除
Noby  2018-05-26 11:09:41  No: 49180  IP: 192.*.*.*

>2.GRIDに表示されたレコード部分をクリックした時にその行(横一列)の上記のを取り出す際のイベントは何でしょうか? 

すいません、言葉が不足していました。

例えば、Gridに下記のデータが表示されているときに
2行目(山田花子の行)のどこかをダブルクリックしたら、山田花子の全ての
情報を取り出したいということです。その場合の、イベントは何なのでしょうか?


NO    氏  名      生年月日    住所
1    山田太郎    1995/01/22  東京都品川区1-2-3
2    山田花子    1996/02/22  東京都品川区1-2-4
3    山田一郎    1964/02/22  東京都品川区1-2-3

編集 削除
igy  2018-05-26 12:01:26  No: 49181  IP: 192.*.*.*

> 上記は直接値を入力する場合ですが、変数をセットする場合は 
> どのようにするのでしょうか? 

Noby さんが、前回の質問時に、参考にしたサイトに

10_ZeosLib における SQL 文のパラメータ設定方法 - ParamByName
http://mrxray.on.coocan.jp/Delphi/plSamples/564_ZeosLib_DelphiBerlin.htm#10

が、あるようです。

編集 削除
Noby  2018-05-26 12:56:04  No: 49182  IP: 192.*.*.*

igyさん

いつもありがとうございます。

サイトの内容を元に作ってみましたが、

モジュール  'SqliteTest2.exe'のアドレス00651769でアドレス00000000
に対する読み取り違反がおきました。  と出ます。

どこが悪いのでしょうか?

---------------------------------
procedure TForm1.Button4Click(Sender: TObject);

begin

    //念のため接続を切断してから設定

  ZQuery1.Close;
  ZConnection1.Disconnect;
  ZConnection1.LoginPrompt := False;

  ZConnection1.Protocol := 'sqlite-3';
  ZConnection1.Database := ExpandFileName('AddressBook.db3');
  ZConnection1.Connect;
  ZConnection1.Disconnect;

  ZQuery1.Close;
  ZQuery1.Connection := ZConnection1;
  //TZConnectionのPrepareSQLプロパティの値をTrueにする
  ZConnection1.Properties.Clear;
  ZConnection1.Properties.Add('PrepareSQL=True');

  //パラメータのチェックありにする
  ZQuery1.ParamCheck := True;

  ZQuery1.SQL.Text := 'INSERT INTO AddressTBL SET [氏名] = :Name, [生年月日] = :Birth,[住所]  = :Addr;';

  //クエリのパラメータの設定
  ZQuery1.ParamByName('Name').AsString   := Edit1.Text;
  ZQuery1.ParamByName('Birth').AsDateTime := StrToDateTime(Edit2.Text);
  ZQuery1.ParamByName('Addr').AsString := Edit3.Text;
  //更新クエリの実行
  ZQuery1.ExecSQL;

 }

end;

編集 削除
igy  2018-05-26 13:29:01  No: 49183  IP: 192.*.*.*

あまり詳しく見ていないのですが、

>  ZConnection1.Connect; 
>  ZConnection1.Disconnect; 

接続して、すぐ切断しているようです。

編集 削除
Mr.XRAY  2018-05-26 13:48:12  No: 49184  IP: 192.*.*.*

最初の質問のコードは多分,以下の Button1Click のコードではないかと思いますが,

http://mrxray.on.coocan.jp/Delphi/plSamples/566_ZeosLib_SQLite_DelphiBerlin.htm#list2

ここのコメントに

  //コードでデータを作成
  //数値以外は"(ダブルクォーテーション)で括る
  
と書いてあります.
ということは

                    + '"山田太郎", "1995/01/22", "東京都品川区1-2-3"' 
        
の住所の部分を,例えば LAddress という string 型で定義したとします.
すると以下のようになります.
つまり,コメントに書いてある通り,そのままということになります.
オン書きなので...

                   LAddress := '"東京都品川区1-2-3"';
                    + '"山田太郎", "1995/01/22",' + LAddress

編集 削除
Mr.XRAY  2018-05-26 13:50:25  No: 49185  IP: 192.*.*.*

>つまり,コメントに書いてある通り,そのままということになります. 

つまり,単なる文字列の単純な操作です.

編集 削除
Mr.XRAY  2018-05-26 14:11:30  No: 49186  IP: 192.*.*.*

以下のようにした方がスマートですね.

LAddress := QuotedStr('東京都品川区1-2-3');

編集 削除
Noby  2018-05-26 14:19:56  No: 49187  IP: 192.*.*.*

Mr.XRAYさん

いつもサイトを参考にさせていただき感謝申し上げます。

直々にコメント下さり、恐縮です。

下記のように作り直して実行しますと、

SQL Error:SQL Logic error. と出てしまいます。

--------------------------------

Zenbu:=''''+'"'+Edit1.Text+'",'
             +'"'+Edit2.Text+'",'
             +'"'+Edit3.Text+'"'+'''';

  Form1.Caption:=Zenbu;//→'"渋谷太郎", "1995/12/31", "東京都新宿区在住"'  と正常に表示されています。
  //exit;


   ZQuery1.SQL.Text := 'INSERT INTO AddressTBL'
                    + '('
                    + '"氏名", "生年月日", "住所"'
                    + ')'
                    + ' VALUES ('
                    + Zenbu
                    + ');';

 ZQuery1.ExecSQL;

編集 削除
Mr.XRAY  2018-05-26 14:39:49  No: 49188  IP: 192.*.*.*

>Form1.Caption:=Zenbu;//→'"渋谷太郎", "1995/12/31", "東京都新宿区在住"'  と正常に表示されています。

正常ではないと思いますが...
以下のどちらが正常ですか ?

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Caption := 'ABC';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Caption := '''ABC''';
end;

編集 削除
Mr.XRAY  2018-05-26 14:51:02  No: 49189  IP: 192.*.*.*

Edit1 に ABC という文字列を入力して以下のコードの違いを確認してください.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Caption := Edit1.Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Caption := 'Edit1.Text';
end;

編集 削除
Mr.XRAY  2018-05-26 16:59:29  No: 49190  IP: 192.*.*.*

先ほど私が提示したコードがありますね.

                   LAddress := '"東京都品川区1-2-3"'; 
                    + '"山田太郎", "1995/01/22",' + LAddress 

です.この LAddress のところを,例えば Edit1 の Text プロパティの値に置き換えるどうなるか考えてやってみてください.
うまくいかない時は,ともかく動作するコードを少しずつ変えてテストみることです.

編集 削除
Noby  2018-05-26 17:06:57  No: 49191  IP: 192.*.*.*

ヘョリメチルさん

移動中でしたので、返事が遅くなり申し訳ございませんでした。

ご指摘の通り、下記のように修正して実行しましたら、無事、出来ました。

ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサレコスァ「ァォナアョヤォァ「ャァ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサォァ「ァォナイョヤォァ「ャァ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサォァ「ァォナウョヤォァ「ァサ

一旦、解決とさせていただきます。

なお、2のヌの情報取得に関しては、もう少し自力で探してみます。

さんもありがとうございました。

編集 削除