vb中的sql select语句在假定为空时返回值
我的代码似乎有一种我不理解的行为。有时它按预期返回null,有时它在假定为null时返回一个值。有人怎么解释?下面是从access中选择并在messagebox中显示结果的代码:vb中的sql select语句在假定为空时返回值,sql,vb.net,ms-access,Sql,Vb.net,Ms Access,我的代码似乎有一种我不理解的行为。有时它按预期返回null,有时它在假定为null时返回一个值。有人怎么解释?下面是从access中选择并在messagebox中显示结果的代码: cmd5.Connection = cnn cmd5.CommandText = "SELECT receipt_num " & _ "FROM brought_coffee, farmer where crop_year= " & yr & " and " & _
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()
这个问题已经在评论中得到了回答,但我将在这里重复,以符合我们的问答格式: 如果找到一行,它看起来会返回null,并且receipt_num为null。如果找不到行,myData5.Read将为false,chkdb将有一个previor值 因此,要真正解决这个问题,可以在每次运行查询之前重置变量,也可以使用显示返回的行数,并查找零而不是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)
你期望什么是零价值?如果你提到chkdb,它可能是由以前的调用设置的吗?Nico+1。如果找到一行,它看起来会返回null,并且receipt_num为null。如果未找到行,myData5.Read将为false,并且chkdb将具有一个优先值。此代码将容易受到sql注入攻击。chkdb是数据库中的值。当条件crop_year=&yr&和&u POWER_date=&dtt&和farmer_CENTER='&ctr&'和farmer.farmer_num=POWER.farmer_num不满足时,我希望它为空。让我说清楚一点。我的程序有三个组合框,它们的值被分配给dtt、ctr和yr。最重要的部分是当我运行程序时,dtt、ctr和yr的值第一次满足返回null的条件时,null显示在消息框中。但是,如果更改了值,使得chkdb不为null,那么它随后将返回一个值。您必须在这一点上是正确的。如果它找到一行,它将返回null,并且receipt_num为null。如果它找不到一行,myData5.Read将为false,chkdb将有一个优先值,但是我如何克服这个问题呢?感谢安全性方面的工作,我将进行调整,但希望在运行查询之前先重置chkdb,或者以保证分配chkdb的方式运行查询。代码中还有其他缺陷。请仔细看一下我的答案中的代码,因为这是一种更好的模式:每次使用块、查询参数等新连接都很重要。谢谢。让我试着给它一个最后的提示:我担心最后的MsgBox电话可能会对你造成影响。最好先在那里的某个地方添加一个String.IsNullOrEmpty check。