Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb中的sql select语句在假定为空时返回值_Sql_Vb.net_Ms Access - Fatal编程技术网

vb中的sql select语句在假定为空时返回值

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 " & _

我的代码似乎有一种我不理解的行为。有时它按预期返回null,有时它在假定为null时返回一个值。有人怎么解释?下面是从access中选择并在messagebox中显示结果的代码:

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。