我有一个SQL表,其中有三列"From“、"To”和"Equivalent“。每个值如下所示:
From To Equivalent Value
1,001.00 2,000.00 200.00
2,001.00 3,000.00 300.00现在,如果用户在textbox1中输入值"1,200.00“,它将向textbox2显示结果值"200.00”,因为这是"From“和"To”之间的相应值。
另一种情况是,如果用户在textbox1中输入值"2,500.00“,它将显示值"300.00”。
到目前为止,我已经尝试了这段代码,但没有成功:
Dim conn As SqlConnection = SQLConn()
Dim da As New SqlDataAdapter
Dim dt As New DataTable
conn.Open()
Dim cmd As New SqlCommand("", conn)
Dim result As String
cmd.CommandText = "SELECT [Equivalent Value] FROM tblSSS"
result = IIf(IsDBNull(cmd.ExecuteScalar), "", cmd.ExecuteScalar)
da.SelectCommand = cmd
dt.Clear()
da.Fill(dt)
If result <> "" Then
If TextBox1.Text >= dt.Rows(0)(1).ToString() And TextBox1.Text <= dt.Rows(0)(2).ToString() Then
TextBox2.Text = dt.Rows(0)(3).ToString()
End If
End If发布于 2017-01-31 18:20:12
如果我没弄错的话,我想我会改变一些事情,这可能会对你有所帮助:
SqlDataAdapter。在这种情况下,我觉得没有必要。IIf的用法。我将使用取代了IIf.的If
考虑到这些,我会看看下面这样的东西:
Dim fromValue As Decimal = 0D
Dim toValue As Decimal = 0D
If Decimal.TryParse(TextBox1.Text, fromValue) AndAlso Decimal.TryParse(TextBox1.Text, toValue) Then
Dim dt As New DataTable
Using conn As SqlConnection = SQLConn,
cmd As New SqlCommand("SELECT [Equivalent Value] FROM tblSSS WHERE [From] >= @From AND [To] <= @To", conn)
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@From", .SqlDbType = SqlDbType.Decimal, .Value = fromValue})
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@To", .SqlDbType = SqlDbType.Decimal, .Value = toValue})
conn.Open()
dt.Load(cmd.ExecuteReader)
End Using
If dt.Rows.Count = 1 Then
TextBox2.Text = If(IsDBNull(dt.Rows(0).Item("Equivalent Value")), "0", dt.Rows(0).Item("Equivalent Value").ToString)
End If
End If注意Decimal.TryParse的用法
将数字的字符串表示形式转换为其等效的十进制形式。返回值表示转换成功还是失败。
这是假设数据库中从和到字段的为Decimal。
现在来解释一下IIf和If之间的区别。即使语句为真,IIf也会执行语句的每一部分,而If只执行其中的一部分。我不会详细介绍,因为这里的许多人已经这样做了。看看这个answer。
根据Andrew Morton's的评论,更符合OP在这里尝试的是使用ExecuteScaler的解决方案。
ExecuteScaler执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。
记住这一点:
'I reset the value of TextBox2.Text. You may not want to.
TextBox2.Text = ""
Dim fromValue As Decimal = 0D
Dim toValue As Decimal = 0D
If Decimal.TryParse(TextBox1.Text, fromValue) AndAlso Decimal.TryParse(TextBox1.Text, toValue) Then
Using conn As SqlConnection = SQLConn,
cmd As New SqlCommand("SELECT [Equivalent Value] FROM tblSSS WHERE [From] >= @From AND [To] <= @To", conn)
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@From", .SqlDbType = SqlDbType.Decimal, .Value = fromValue})
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@To", .SqlDbType = SqlDbType.Decimal, .Value = toValue})
conn.Open()
Try
TextBox2.Text = cmd.ExecuteScalar().ToString()
Catch ex As Exception
End Try
End Using
End If我已经在ExecuteScaler MSDN文档中使用了这个示例。您可能希望更好地处理Try Catch上的异常,而不是浪费它。
您可能希望将此代码放在TextBox1.Leave方法或Button.Click方法上。这完全取决于你。
您可能需要做一些更改,但我认为这会给您一些关于如何继续编写代码的想法。
https://stackoverflow.com/questions/41952580
复制相似问题