DBnull,ms-access时出错

时间:2016-11-20 17:20:06

标签: vb.net ms-access

我正在尝试在访问数据库中对SUM列进行修改,它在某种程度上有效 column5column6是日期。假设我的日期为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

1 个答案:

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