DAOでバインド変数を使用する方法があれば教えてください。
oo4o、ADO、でのこんな感じの操作はできますか?
SQL文の実行(更新、挿入、削除)部分
http://www-6.ibm.com/jp/software/data/developer/library/techdoc/oo4otoado.html
パラメータクエリで代用できるかもしれません。
QueryDefオブジェクトとParameterオブジェクトについて調べてみてください。
ただし、バインド配列(oo4oのOraParamArray)に相当する機能はありません。
やっぱり、クエリーを作成する方法でしかないですよね。。。
有難うございます。
ちなみに QueryDefオブジェクトは、Nameを空文字列にしておく事で、
名前の無い「一時的なクエリ」として生成する事ができます。
Set QD = DB_JET.CreateQueryDef("", SQL)
Set RS = QD.OpenRecordset(dbOpenSnapshot)
上記の場合、オブジェクトを閉じると、一時的なクエリも
同時に削除されますので、管理の手間が省けます。
一時的ではなく、mdb内に保存され続けるようなクエリにしたいなら、
[DAO から ADO への移植 5]—[パラメータ化ストアド クエリの作成]
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado_5.asp
の例にあるように、Nameを指定してやればOKです。
それからバインド変数については、JETの場合、
SQLの「PARAMETERSステートメント」を使うことで、
変数名や変数の型を定義できます。
例えば、
SQL = ""
SQL = SQL & "PARAMETERS StaffCode TEXT(20);"
SQL = SQL & "SELECT * FROM Staff WHERE Code = StaffCode;"
というSQL文を実行すると、Oracleでいう所の
SELECT * FROM Staff WHERE Code = :StaffCode
に近い意味となります。
(パラメータの指定は、QueryDefのParamatersプロパティで行います)
# なお、PARAMETERS句を用いずに、直接
# SQL = "SELECT * FROM Staff WHERE Code = StaffCode;"
# のように書く事もできますが、できればPARAMETERSステートメントを
# 使って、変数定義を行った方が良いでしょう。
一方、Jet以外のデータベースにDAO経由で接続している場合は
(ODBCリンクテーブルでの接続はなく、ODBCDirectでの接続の場合)、
ストアドプロシージャの引数を"?"で表現するという方法が利用できます。
Set QD = DB_SQLServer.CreateQueryDef("qry", "{ call MyInsert(?, ?) }")
QD.Parameters(0).Direction = dbParamInput
QD.Parameters(1).Direction = dbParamOutput
QD.Parameters(0).Value = "RainBow"
QD.Execute
Debug.Print QD.Parameters(1).Value