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

質問はコメントですでに回答されていますが、Q&A 形式に合わせてここで繰り返します。

行が見つかった場合は null を返すようで、recipe_num は null です。行が見つからない場合、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 に答える