![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_12.png?e8efa67)
No.1ベストアンサー
- 回答日時:
「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 で調べてみてください。
この回答へのお礼
お礼日時:2006/05/30 09:02
わかりやすく回答いただき有難うございました。
おかげ様でなんとなく理解できましたが、実際に使ってみて理解を深めていきたいと思います。
アクセスは奥が深いですねー。
No.2
- 回答日時:
>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ステートメントを代入し実行させるかの違いという事で良いと思いますが。
この回答へのお礼
お礼日時:2006/05/30 09:00
回答いただきありがとうございました。
言葉がむつかしくて理解するのに時間がかかります。
例文を何度も読んで理解できたように思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- SQL Server 大学でSQLの授業があるのですが全くわかりません。 表ではなく文で説明されているのですが調べても理解 6 2022/07/20 02:26
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- SQL Server SQLについて質問です。 a表がありその表には従業員名を保存するname列があります。 LIKE演算 1 2022/05/17 17:49
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ADOを使ったDBアクセス後のメモ...
-
テキストボックス名を変数で指...
-
ストアドプロシージャで外部プ...
-
CMDとSQL
-
Accessファイルバージョンの取得
-
#1062 - '0' は索引 'PRIMARY' ...
-
SQLPLUSで結果を画面に表示しない
-
特定のエクセルファイルを起動...
-
共有フォルダに誰が何にアクセ...
-
(Excelマクロ)datファイルをエ...
-
【Excel】[Expression.Error] ...
-
月が変わったら自動でシートが...
-
tmpファイル なぜできる?削除...
-
VBAでCSVファイルが使用中かど...
-
アクセスがインポートできる容...
-
アクセスでエラー このフィー...
-
ファイルは開くのに「見つから...
-
accessで項目内の文字を自動改...
-
Access VBA を利用して、フォル...
-
Batch: フォルダ内の特定のファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADOを使ったDBアクセス後のメモ...
-
AccessのMDBファイルを開く際に...
-
テキストボックス名を変数で指...
-
ストアドプロシージャで外部プ...
-
Symfowareでの動的SQL
-
オラクルのシーケンスについて
-
アウトルックのメール送信
-
警告音について
-
Notesにて「指定したコマンドが...
-
ORACLE9iをVB6のADOで更新でき...
-
SQL Server 2000 SELECT文実行...
-
ACCESS2007でのDAO(?)につき...
-
postgresql DELETE後commit...
-
Oracle:Oracleシーケンスとは?
-
VBからRDOの接続ができない!困...
-
SQL Serverへエクスポートする...
-
Oracle10g キャッシュヒット率...
-
oracle8iでのシーケンス作成
-
パワーポイントの利用アイデア
-
ACCESS2000でテキストファイル...
おすすめ情報