0

我编写了这段代码来比较实际值和用户输入的值。我在名为 Spec 的表中设置了实际值

sampleID Category WheatType Silo M_Min   M_Max  WG_Min  WG_Max
1001       1BK      AGP      1   25.00   27.00
1002       1BK      AGP      21                  25.00   28.00

这是比较值的代码

sql = "SELECT * FROM Spec WHERE WheatType= '" & ddlType.SelectedValue & "' AND Category='1BK' AND Silo='" & txtSilo.Text & "'"
cmd = New OleDbCommand(sql, cnnOLEDB)
cnnOLEDB.Open()
Dim dr As OleDbDataReader
dr = cmd.ExecuteReader()
While dr.Read()

    Try

        If txtHB43S.Text >= dr("M_Min").ToString() And txtHB43S.Text <= dr("M_Max").ToString() Then
            stsHB43S.Text = "Pass"

        ElseIf txtHB43S.Text <= dr("M_Min").ToString() And txtHB43S.Text >= dr("M_Max").ToString() Then
            stsHB43S.Text = "Failed"
            stsHB43S.ForeColor = System.Drawing.Color.Red

        ElseIf txtHB43S.Text <> dr("M_Min").ToString() And txtHB43S.Text <> dr("M_Max").ToString() Then
            stsHB43S.Text = ""

        Else
            stsHB43S.Text = ""

        End If


        If txtGlutematic.Text >= dr("WG_Min").ToString() And txtGlutematic.Text <= dr("WG_Max").ToString() Then
            stsGluten.Text = "Pass"

        ElseIf txtGlutematic.Text <= dr("WG_Min").ToString() And txtGlutematic.Text >= dr("WG_Max").ToString() Then
            stsGluten.Text = "Failed"
            stsGluten.ForeColor = System.Drawing.Color.Red

        ElseIf txtGlutematic.Text <> dr("WG_Min").ToString() And txtGlutematic.Text <> dr("WG_Max").ToString() Then
            stsGluten.Text = ""

        Else
            stsGluten.Text = ""

        End If

问题是如果我只输入 的值txtHB43S.Text = 25.00, Silo=1 and WheatType='AGP',状态将显示'Pass'stsHB43S但它在 stsGluten 中也会显示'pass'

输出

HB43s = 25.00 stsHB43S=Pass
Gluten =  -    stsGluten =Pass

谁能帮我

4

2 回答 2

0

您的陈述中的逻辑if不正确。第一个else永远不可能是真的,因为and.

我猜你想要这样的东西:

If txtHB43S.Text >= dr("M_Min").ToString() And txtHB43S.Text <= dr("M_Max").ToString() Then
  stsHB43S.Text = "Pass"
else
  stsGluten.Text = "Failed"
  stsGluten.ForeColor = System.Drawing.Color.Red
  end if

(我不确定您何时或是否要为 stsGlutenText 分配“”值。)

Brian P 有很好的建议。例如,“25aslduihhaljsdlsdaf”的输入值将通过,除非您将两个值都转换为数值,例如double在比较之前(查找ctypeisnumeric)。数据库建议好的安全策略。

于 2013-01-17T05:24:57.290 回答
0

你在这里有几个不同的问题。首先,您正在对字符串进行算术比较。在比较它们之前,您应该将它们解析为适当的数字类型。其次,您应该验证所有输入,以确保它们在处理之前符合预期。有人可以传入直接传递给您的 SQL 查询的值这一事实意味着他们可以直接访问您的 SQL 数据库。查找 SQL 注入。验证您的输入将使您能够捕捉到某人何时传入空值以及何时有人传入非数字值。

于 2013-01-17T04:11:55.173 回答