2009-07-02 10 views
0

どのように選択クエリの条件を与えるか?どのように選択クエリの条件を与えるか?

Access 2003の

MYクエリ

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, 
(select TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 

は、私が使用したい:

WHERE CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

を私はどこ条件を与えることができますどのように上記のクエリから、私はこれを試してみました

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, 
(select TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 
WHERE F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

しかし、「データ型の不一致エラー」

を示したことも、私が試した:

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID and F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate 
& "' order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, (select 
TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 WHERE 
F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

をしかし、それは同じ「データ型の不一致エラー」を

を示すいずれかが私を助けることができますしてください

答えて

0

リテラル文字列をSQLテキストに注入するのではなく、プリペアドステートメントを使用することを検討してください。これによりSQLインジェクション保護が提供されるだけでなく、選択したデータアクセスライブラリにパラメータ値の作成を延期することができます。次のADOコードは、Accessデータベースエンジンの専用OLE DBプロバイダを使用してDATETIMEの値を作成し、VBA関数CDate()を使用して、ローカルコンピュータのWindows地域設定を使用して日付を表す文字列をキャストします(もちろん、データベースファイルを持つマシン):

Dim sDate As String 
sDate = 4/1/09" ' ambiguous DATETIME value 

Dim eDate As String 
eDate = "2009-12-31 23:59:59" ' unambiguous DATETIME value 

Dim cmd As ADODB.Command 
Set cmd = New ADODB.Command 
With cmd 
    .ActiveConnection = CurrentProject.Connection ' Access UI object 
    .CommandText = _ 
     "SELECT * " & _ 
     " FROM Cards " & _ 
     " WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;" 
    .Parameters.Append .CreateParameter(_ 
     ":start_date", adDate, adParamInput, , CDate(sDate)) 
    .Parameters.Append .CreateParameter(_ 
     ":end_date", adDate, adParamInput, , CDate(eDate)) 

    Dim rs As ADODB.Recordset 
    Set rs = .Execute 
End With 

MsgBox rs.GetString 

さらに、それをストアドプロシージャ

CurrentProject.Connection.Execute _ 
    "CREATE PROCEDURE GetCards " & _ 
    "(" & _ 
    " :start_date DATETIME, " & _ 
    " :end_date DATETIME " & _ 
    ") " & _ 
    "AS " & _ 
    "SELECT * " & _ 
    " FROM Cards " & _ 
    " WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;" 

その後、実行時に毎回これを使用します:一度設計時にこれを行う

.CommandText = _ 
    "EXECUTE GetCards :start_date, :end_date;" 

あなたのクエリを変更する必要がある(ただし、必要なパラメータがない場合は、この方法 - あなたは常にすることができますしかし、オプションのパラメータにデフォルト値を追加すると、すべてのフロントエンドでSQLコードを変更するのではなく、一方のバックエンドでprocを変更することができます。

5

アクセスでは、 'ではなく、日付リテラルの区切り文字として#を使用します。それに応じて交換する必要があります。

+0

正解! +1 – Cerebrus

関連する問題