1

私は非常に単純な問題を抱えています。VB.NETフォームにいくつかの日付ピッカーコントロールがあり、ユーザーが「startDate」と「endDate」をorderDate選択すると、ユーザーが選択した開始日と終了日の間にある関連テーブルのすべての行が表示されます。

関連するコードは次のとおりです。

Private Sub generate_report_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generate_report.Click
    Try
        Dim con As New OleDb.OleDbConnection
        con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\KHMSDB.accdb"
        con.Open()
        Dim sql As String
        Dim selected As String = ""
        Dim ds As DataSet = New DataSet

        Dim adapter As New OleDb.OleDbDataAdapter
        sql = "SELECT OrderDate AS `Order Date and Time`, Items AS `Ordered Items` FROM Orders WHERE Format(Orders.OrderDate,'mm/dd/yyyy') >= #" + startDate.Value.Date + "# AND Format(Orders.OrderDate,'mm/dd/yyyy') <= #" + endDate.Value.Date + "#"
        adapter.SelectCommand = New OleDb.OleDbCommand(sql, con)
        adapter.Fill(ds)
        gridReport.DataSource = ds.Tables(0)

    Catch ex As Exception

        MsgBox("Operation failed. " + ex.ToString)

    End Try

今日の日付でデータベースに新しい行を保存し、「開始」と「終了」の両方の日付をデフォルトの日付(つまり今日の日付)のままにすると、保存したばかりの新しい行が表示されません。今日入力された新しい行は、「開始日」を11月30日まで移動した場合にのみ表示されます。次に、日付が12月12日の新しい行を追加します。繰り返しになりますが、終了日を12月12日以上に選択した場合は表示されません。開始日を12月1日まで移動した場合にのみ表示されます。11月21日の行を入力することにしました。11月21日に開始日と終了日の両方でクエリを実行すると、その行が表示されます。次に、1月8日に新しい行を入力しました。startDateを上に移動するか、endDateを下に移動するかの組み合わせでは、1月の順序が表示されません。どうしたの??私'

4

1 に答える 1

2

これで問題になる可能性があるのは、文字列形式です。Accessが文字列を日付に変換してから比較するか、日付を文字列に変換してから比較するかはわかりません。あなたはこれを試すことができます:

Format(Orders.OrderDate,'mm/dd/yyyy') >= Format(#" + startDate.Value.Date + "#,'mm/dd/yyyy')

または、いつでも日付を直接使用することもできます。

OrderDate >= #" + startDate.Value.Date + "#"

編集:、私のデューデリジェンスを行うには、実際には次のようなクエリを実行する必要があります

OrderDate >= @StartDate

次に、このコードを追加します

adapter.Parameters.Add("@StartDate", startDate.Value.Date);

パラメータの使用は、堅牢なコードにとって、そして恐ろしいSQLインジェクション攻撃を回避するために重要です。

于 2012-12-07T19:45:40.027 に答える