我正在尝试使用这个查询,但是我得到了一个错误
标准中的数据不匹配
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)发布于 2015-04-02 09:05:42
我的编辑似乎被取消了,下面是:
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 + ""发布于 2015-04-02 12:37:03
日期只是额外的参数。您的方法(以及其他答案)的一个问题是,您正在将非常好的DateTime变量转换为string。MSAccess/OleDb通常对事情有意义,但这是不必要的,允许其他东西来解释您的意图通常是不可取的。
DB列必须实现为Date类型,才能将数据视为Dates (介于之间),但不需要“格式化”日期变量(任何时候)。
另一个问题是在处理命令和连接对象时处理它们:
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属性将完全正常工作,无需任何按摩或处理。
这是一个关于 method和dbConnections信息的链接。
请注意,OleDB实际上没有使用命名参数(@Pro,@dt1 1)。它们只是占位符,您必须按照它们在SQL语句中出现的相同顺序进行AddWithValue。比较常见的情况是将params指定为"?",但是有意义的params有助于将右var映射到代码中的右param。
最后,这在DateTimePicker中是不可能发生的,但是将UI控件中的字符串粘合在一起会导致SQL注入攻击,因此应该始终避免。使用参数的SQL通常更容易编写、生成、读取和处理。
发布于 2015-04-02 08:12:42
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)https://stackoverflow.com/questions/29407520
复制相似问题