2009-07-02 4 views
0

Wie gebe ich die Bedingung in der Select-Abfrage ein?Wie gebe ich die Bedingung in der Select-Abfrage ein?

ACCESS 2003

Meine Suche

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 

ich verwenden möchte:

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

Aus der obigen Abfrage, wie kann ich das, wo Bedingung geben, habe ich versucht, dieses:

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 & "' 

Aber es „DATA TYPE MISMATCH ERROR“

zeigt Und ich habe auch versucht:

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 & "' 

Aber es gleiche „DATA TYPE MISMATCH ERROR“

Kann zeigt jemand mir bitte helfen

Antwort

0

Anstatt literale Strings in Ihren SQL-Text zu injizieren, sollten Sie vorbereitete Anweisungen verwenden. Dies gibt Ihnen nicht nur einen SQL-Injection-Schutz, Sie können die Erstellung von Parameterwerten auf Ihre Datenzugriffs-Bibliothek der Wahl z. Der folgende ADO-Code verwendet den dedizierten OLE DB-Provider für die Access-Datenbank-Engine zum Erstellen von DATETIME Werten und die VBA-Funktion CDate() zum Umwandeln von Zeichenfolgen für Datumsangaben in Date-Werte unter Verwendung der Windows-Ländereinstellungen auf dem lokalen Computer (die möglicherweise nicht mit denen identisch sind Maschine mit der Datenbank-Datei, natürlich):

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 

noch besser, macht es zu einem gespeicherten proc zB Tun Sie dies einmal zur Entwurfszeit:

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

Dann jedes Mal zur Laufzeit verwenden:

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

diese Weise, wenn Ihre Abfrage ändern muss (aber die erforderlichen Parameter nicht - man kann immer hänge optionale Parameter an die Standardwerte an, aber Sie können nur den Prozess in dem einen Back-End ändern, anstatt den SQL-Code in allen Frontends ändern zu müssen.

5

Access verwendet # als Trennzeichen für Datumsliterale, nicht '. Sie müssen entsprechend ersetzen.

+0

Richtig und schnell! +1 – Cerebrus

Verwandte Themen