最速怪談選手権

初歩的な質問ですみません。

ACCESS2002でVBAを作成しますが、データベースのテーブルに接続して加工や編集を行ったり、レコードセットを作成したりするときに、CMD文を使う場合とSQL文を使う場合とありますが使い分けがよくわかりません。

どういう場合にCMD.COMMANDTEXT=・・・・を使い、どういうときにSQL文を発行するのか。

本を読んでみてもよくわかりません。
どなたかわかりやすく教えてください。

A 回答 (2件)

「CMD文を使う場合」 じゃなくて 「Command オブジェクトを使う場合」ですね。




「Command オブジェクトが何なのか」とかじゃなくて「使い分け」で私なりの回答をします。

hoge = "UPDATE employees SET address = '" & newAddress & "' WHERE employeeID = '" & empID & "'"
例では変数 empID に職番、変数 newAddress に住所が入っていて、テーブル employees から 列 employeeID の値が変数 empID と同じ行を探して、ヒットしたレコードの列 address の値を newAddress に更新しています。
変数の中に半角のアポストロフィが入ると正常に処理できませんので「'」を「''」のように二重化したりする必要があります。
または傍若無人な開発者なら「シングルクォーテーションは入力禁止!!」とか「アルファベットは全角に強制変換しますよ」なんてやっちゃったり。
# 理由は、完成した SQL 文を見てみればわかりますね?

それぐらいなら可愛いもので、もし悪意を持った(または好奇心旺盛な)ユーザーによる SQL インジェクションの問題があります。
SQL インジェクションについては下記 URL で調べてみてください。怖いですよ。
http://www.google.com/search?hl=ja&lr=lang_ja&ie …

使い方としては「プログラム外の何かによる操作が介入しないレコード操作」で使うといいんじゃないでしょうか。
設定情報用のテーブルから設定情報を取得したり更新したりする場合とか。


一方の Command オブジェクトですが、レコード操作では Parameter オブジェクトとセットで使うことが多いです。
Access で言えば「パラメータ クエリ」を事前に用意しておいて、Command オブジェクトの CommandText プロパティにクエリの名前を入れて、Parameters プロパティにパラメータ クエリの個々の引数名、引数の型、サイズ、値を入れて使用します。
最初の例で言えば、address や employeeID のための引数をクエリに用意しておき、Parameter オブジェクトを通じて newAddress や empID の値をセットします。

このやり方ではパラメータに突っ込んだ値をそのまんま使用しますので、シングルクォーテーションを二重化する手間が省けます。
また、SQL インジェクションにも強いです。

さらに、Command オブジェクトを使うからと言ってあらかじめパラメータ クエリを作成しておかなくとも、プログラムの中で動的に作成することもできます。

Command オブジェクトの使いどころは非常に多くて説明しきれませんね。
まずは先のように「プログラム以外の何かによる操作が介入するレコード操作」ですかね。
検索フォームでユーザーが入力した条件を使って検索するとか、編集用フォームでユーザーが入力した値を使って更新するとか。

Command オブジェクトの操作方法についてはお持ちの書籍や Web で調べてみてください。
    • good
    • 0
この回答へのお礼

わかりやすく回答いただき有難うございました。
おかげ様でなんとなく理解できましたが、実際に使ってみて理解を深めていきたいと思います。
アクセスは奥が深いですねー。

お礼日時:2006/05/30 09:02

>CMD文を使う場合とSQL文を使う場合とありますが使い分けがよくわかりません。


接続したConnectionで開いているCommandオブジェクトを使用するときにcmdを使います。
例えばCommandオブジェクトのCommandTextプロパティにアクションクエリを代入してExecuteメソッドを実行するとアクションクエリを実行できます。
選択クエリではExcuteメソッドを用いることはできませんがアクションクエリのみExcuteメソッドで実行が出来ます。
例えば
Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim mySQL As String
Set cn = CurrentProject.Connection

mySQL = "DELETEやUPDATEなどのアクションクエリ(SQL)を記述する"
cmd.ActiveConnection = cn
cmd.CommandText = mySQL 'CommandTextにSQLを代入する。
cmd.Execute 'ExceuteメソッドでSQLステートメントを実行する
とか
クエリを定義するときに
Set cmd = New ADODB.Command
cmd.CommandText = "SELECT * FROM テーブル名;"
のようにSQLをCommandTextにセットする。

Dim cn As ADODB.Connection
Dim mySQL As String
Set cn = CurrentProject.Connection
mySQL = "DELETE * FROM テーブル名"
cn.Execute mySQL
としてもアクションクエリを実行できます。
この場合はmySQLにSQLをセットしてExecuteメソッドで実行させているだけ。

なので
開いているCommandオブジェクトを使用するかしないかでSQL文だけかcommandtextにSQLステートメントを代入し実行させるかの違いという事で良いと思いますが。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございました。
言葉がむつかしくて理解するのに時間がかかります。
例文を何度も読んで理解できたように思います。

お礼日時:2006/05/30 09:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!