我正在尝试在访问数据库中对SUM列进行修改,它在某种程度上有效
column5
和column6
是日期。假设我的日期为2016年11月15日的记录,另一个记录的是2016年11月19日。如果我选择'OdDate'作为2016年11月15日和'DoDate'作为2016年11月19日它是有效的,它将记录总和。当我从2016年11月15日选择让我们说... 20/11/2016,在这种情况下,标量从2016年11月19日返回记录,它忽略了2016年11月15日的记录。如果我进一步选择几天,那么它会抛出错误dbnull
我知道为什么它会抛出dbnull错误,我想知道的是,当我选择从2016年11月15日到2016年11月20日时,为什么它会忽略15/11/2016的记录,为什么不抛出dbnull错误,没有日期为2016年11月20日的记录。相反,它只返回2016年11月19日的记录。
Dim provider As String
Dim dataFile As String = My.Application.Info.DirectoryPath
provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
dataFile = ("Database\Baza-Original.accdb")
Dim SqlQry1 As String = "SELECT SUM(Column2 + Column3 + Column4) FROM [Table] WHERE Column1 = @1 BETWEEN Column5 = @2 AND Column6 = @3"
Using myconnection As New OleDbConnection(provider & dataFile)
myconnection.Open()
Dim cmd1 As New OleDbCommand(SqlQry1, myconnection)
cmd1.Parameters.AddWithValue("@1", CB.SelectedItem)
cmd1.Parameters.AddWithValue("@2", OdDate.Value.Date)
cmd1.Parameters.AddWithValue("@3", DoDate.Value.Date)
If cmd1.ExecuteScalar() Then
Dim field As Int32
field = cmd1.ExecuteScalar()
LBL.text = field
myconnection.Close()
MsgBox("msg1. ", MsgBoxStyle.Information, "successful")
Else
MsgBox("msg2. ", MsgBoxStyle.Critical, "Unsuccessful!")
Return
End If
End Using
答案 0 :(得分:2)
虽然BETWEEN
运算符看起来很容易使用,但你必须要小心它。最重要的是,比较日期是严格按照数学方式进行的,而不是我们可能认为在人类中做到这一点的方式。
此外,AddWithValue
可能会产生意想不到的结果,永远不应该使用,因为制作能够让它发挥作用的代码并不值得努力 - Can we stop using AddWithValue() already?
SELECT SUM(Column2 + Column3 + Column4)
FROM [Table]
WHERE Column1 = @1
AND Column5 >= @2 AND Column6 < @3
并在代码中设置参数:
cmd1.Parameters.Add(New OleDbParameter With {.ParameterName = "@3", .OleDbType = OleDbType.Date, .Value = OdDate.Value.Date.AddDays(1)})