我有一个程序,似乎没有做我想做的事情。一般来说,伪代码是:输入里程数(miles.text),点击按钮,检查:输入的里程数是否等于或小于数据库中的里程半径(milestotextbox)?如果是这样,请抓住与该半径相对应的卡车装载率(truckloadratetext)并将其显示在名为“rate”(rate.text)的文本框中,如果没有,则继续查看直到EOF。我已经展示了下面的代码。它允许我输入里程但不会检查并显示结果。
表中的数据如下所示:
ID MILESTO TRUCKLOADRATE
1 50 200
2 100 300
3 200 700
4 300 800
因此,如果有人输入10的里程数,我希望它的卡车运费为200美元。如果有人输入250,那么费率就会是800.如果里程超出范围,我现在也不会太担心会发生什么。试图找出为什么这样的机制不起作用。这是我第一次使用带有LOOP命令的记录,所以我试图用我的程序保持简单。
我可能做错了什么?提前谢谢你,希望所有人都有一个伟大的新年!
Public Class Form1
Private Property EOF As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the '_test_2DataSet.test' table. You can move, or remove it, as needed.
Me.TestTableAdapter.Fill(Me._test_2DataSet.test)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Do Until EOF()
If Val(MilestoTextBox.Text) <= Val(Miles.Text) Then
rate.Text = TruckloadTextBox.Text
End If
Loop
End Sub
End Class
答案 0 :(得分:1)
我既不知道你在哪里设置EOF
变量,也不了解它的用途。看一下下面的示例,该示例演示如何循环DataTable的所有行(ORDER BY MILESTO ASC
)以查找大于给定值的最接近的值:
Dim mileAge = Int32.Parse(Miles.Text)
Dim rate = 0
For Each row In _test_2DataSet.test
If mileAge <= row.MILESTO Then
rate = row.TRUCKLOADRATE
Exit For
End If
Next
If rate <> 0 Then
TxtRate.Text = rate.ToString
End If
如果您最初无法按MILESTO
订购,或者您只是想看到另一种非数据库查询的方法,请尝试使用此LINQ-To-DataSet方法:
rate = (From r In _test_2DataSet.test Order By r.MILESTO
Where mileAge <= r.MILESTO
Select r.TRUCKLOADRATE).FirstOrDefault
如果要查询数据库,则以下SQL将返回大于/等于TRUCKLOADRATE
- 参数的最近@MileAge
:
SELECT TOP (1) TRUCKLOADRATE
FROM Test
WHERE (MILESTO >= @MileAge)
ORDER BY MILESTO - @MileAge
向DataAdapapter添加一个查询,该查询返回单个值并具有有意义的名称,如getTruckloadRateByMileAge
。然后就这么简单:
Dim loadRate = DirectCast(daTest.getTruckloadRateByMileAge(mileAge), Decimal)
答案 1 :(得分:0)
很抱歉在这里延迟回答这个问题,我要感谢所有回答的人,特别是蒂姆。
总之,如果用户想要搜索数据集并将用户输入的值与某种索引进行比较(在我的情况下,如果输入的里程数小于或等于某个边界值)并获得相应的满足该标准的记录,有效的解决方案(谢谢Tim!)是:
Dim mileAge = Int32.Parse(Miles.Text)
Dim rate = 0
For Each row In _test_2DataSet.test
If mileAge <= row.MILESTO Then
rate = row.TRUCKLOADRATE
Exit For
End If
Next
If rate <> 0 Then
TxtRate.Text = rate.ToString
End If
在该示例中,里程数被转换为一个值,该值可用于与名为MILESTO的数据集中的列进行比较,该列是与运输货物的价格相对应的里程半径,称为TRUCKLOADRATE。程序遍历数据集中的每一行,直到满足里程数&lt; = row.MILESTO的条件。
我最初的想法是使用搜索直到EOF,这种方法效果更好。
感谢所有人再次为其他用户推迟总结而道歉。