'Data criteria mismatch SQL' 使用日期时

'Data criteria mismatch SQL' when using Dates

我正在尝试使用此查询,但出现错误

Data mismatch in criteria

Dat 是 MS Access 数据库中的 Date 列。我正在尝试 select 为从日期选择器中选择的日期之间名为 Pro 的每一行命名为 Total 的列的总和...

有很多关于这个的帖子,但我的查询与那些

Dim DTST As String
DTST = DateTimePicker1.Value.ToString

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN'" + DTST + "' AND '" + DTEn + "'"

Dim cmd2 As OleDb.OleDbCommand = New OleDbCommand(Query1, dbCon)
cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)

Access 中的参数化日期需要用 # 包裹在引号外(如果它是文字日期则在里面,例如 #10/10/2015#

Dim DTST As String
DTST = DateTimePicker1.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN " + DTST + " AND " + DTEn + ""

Dim cmd2 As OleDb.OleDbCommand = New OleDbCommand(Query1, dbCon)
cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)

我的编辑好像被取消了,所以这里是:

Dim DTST As String
DTST = DateTimePicker1.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN " + DTST + " AND " + DTEn + ""

日期只是附加参数。您(和其他答案)这样做的方式的问题之一是您正在将非常好的 DateTime 变量转换为字符串。 MSAccess/OleDb 通常会让事情变得有意义,但这是不必要的,而且让其他东西来解释你的意图通常是不可取的。

数据库列必须作为 Date 类型实现,以便将数据视为 Dates(BETWEEN),但您不需要 "format" 日期变量(曾经)。

另一个问题是处理完 Command 和 Connection 对象后:

Dim SQL = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN @dt1 AND @dt2"


Using dbCon As OleDbCOnnection(GetConnection()),
     cmd As New OleDbCommand(SQL, dbCon)

    dbCon.Open

    ' ToDO be sure SelectedItems.COunt >0 earlier
    cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)
    cmd2.Parameters.AddWithValue("@dt1",  DateTimePicker1.Value)   
    cmd2.Parameters.AddWithValue("@dt2",  DateTimePicker2.Value)  

    Dim Total = cmd.ExecuteScalar()
    ...
End Using     ' close and dispose of Command and Connection objects

如您所见,您将 DateTime 值作为任何其他参数传递给它,DTP 的.Value 属性 将在没有任何按摩或处理的情况下完美运行。

这里有一个 link,提供有关 和 dbConnections 的一般信息。


请注意 OleDB 实际上并未使用命名参数(@Pro、@dt1)。它们只是 占位符 ,您必须按照它们在 SQL 语句中出现的相同顺序 AddWithValue。更常见的是将参数指定为“?”,但有意义的参数有助于将正确的 var 映射到代码中的正确参数。

最后,DateTimePicker 不会发生这种情况,但是将 UI 控件中的字符串位粘合在一起以构成 SQL 会导致 SQL 注入攻击,应该总是被避免。 SQL 使用参数通常更易于编码、构建、阅读和维护。