0

我的代码似乎表现得我不明白。有时它会按预期返回 null ,有时它会在它应该为 null 时返回一个值。有人怎么解释这个?这是从访问中选择并在消息框中显示结果的代码:

cmd5.Connection = cnn

cmd5.CommandText = "SELECT receipt_num " & _
         "FROM brought_coffee, farmer where crop_year= " & yr & " and " & _
         "brought_date=#" & dtt & "# and farmer_centre='" & ctr & _
         "' and farmer.farmer_num=brought_coffee.farmer_num"

myData5 = cmd5.ExecuteReader

While myData5.Read()
   chkdb = myData5(0).ToString
End While

MsgBox("the check" & chkdb)
myData5.Close()
4

1 回答 1

1

这个问题已经在评论中回答了,但我会在这里重复它以匹配我们的问答格式:

如果找到一行,它看起来返回一个空值,并且receipt_num 为空值。如果它没有找到一行,myData5.Read() 将为 false 并且 chkdb 将具有先验值。

因此,要真正解决问题,您可以在每次运行查询之前重置变量,或者您可以使用Count() 聚合函数来显示返回的行数,并查找零而不是 null。

我还想解决您代码中一个非常严重的安全问题。您不应该使用字符串连接将查询值替换为您的 sql 字符串。你想要更像这样的东西:

Using cnn As New OleDbConnection("connection string here"), _
      cmd5 As New OleDbCommand("", cnn)

    cmd5.CommandText = _
         "SELECT receipt_num " & _
         "FROM brought_coffee, farmer " & _
         "WHERE crop_year= ? " & _
             "and brought_date= ? and farmer_centre= ? " & _
             "and farmer.farmer_num=brought_coffee.farmer_num"

    cmd5.Parameters.Add("crop_year", OleDbType.Integer).Value = yr
    cmd5.Parameters.Add("brougt_date", OleDbType.Date).Value = dtt
    cmd5.Parameters.Add("farmer_centre", OleDbType.VarChar).Value = ctr

    cnn.Open()        
    chkdb = Cstr(cmd5.ExecuteScalar())
End Using

MsgBox("the check" & chkdb)
于 2012-04-03T20:34:07.283 回答