'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 使用参数通常更易于编码、构建、阅读和维护。
我正在尝试使用此查询,但出现错误
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,提供有关
请注意 OleDB
实际上并未使用命名参数(@Pro、@dt1)。它们只是 占位符 ,您必须按照它们在 SQL 语句中出现的相同顺序 AddWithValue
。更常见的是将参数指定为“?”,但有意义的参数有助于将正确的 var 映射到代码中的正确参数。
最后,DateTimePicker
不会发生这种情况,但是将 UI 控件中的字符串位粘合在一起以构成 SQL 会导致 SQL 注入攻击,应该总是被避免。 SQL 使用参数通常更易于编码、构建、阅读和维护。