我尝试使用此查询,但收到错误
标准中的数据不匹配
Dat
是MS Access数据库中的Date
列。我试图在从日期选择器中选择的日期之间为名为Total
的每一行选择名为Pro
的列的总和...
有很多关于此的帖子,但我的查询与那些
不同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)
答案 0 :(得分:4)
日期只是其他参数。你(以及其他答案)正在做的方式的一个问题是你将完美的DateTime
变量转换成字符串。 MSAccess / OleDb通常会理解事物,但这是不必要的,允许其他东西来解释你的意图通常是不可取的。
数据库列必须实现为Date
类型才能将数据视为Dates
(BETWEEN),但您不需要“格式化”日期变量(永远) 。
另一个问题是在完成它们时处理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
属性将完美地运行,无需任何按摩或处理。
以下是GetConnection()
method和dbConnections的信息链接。
请注意,OleDB
实际上并不使用命名参数(@Pro,@ dt1)。它们只是占位符,您必须按照它们在SQL语句中出现的顺序AddWithValue
。更常见的是将params指定为“?”,但有意义的params有助于在代码中将右var映射到右边的param。
最后,它不能用DateTimePicker
发生,但是将来自UI控件的字符串粘合在一起以使SQL可以导致SQL注入攻击并且应该始终避免。使用参数的SQL通常更容易编码,构建,读取和保存。
答案 1 :(得分:2)
我的编辑似乎被取消了,所以这是:
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 + ""
答案 2 :(得分:1)
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)