使用日期时'数据标准不匹配SQL'

时间:2015-04-02 07:38:40

标签: sql .net vb.net ms-access

我尝试使用此查询,但收到错误

  

标准中的数据不匹配

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)

3 个答案:

答案 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)