直到EOF循环与VB 2010中的记录

时间:2011-12-30 17:57:46

标签: vb.net visual-studio-2010 loops

我有一个程序,似乎没有做我想做的事情。一般来说,伪代码是:输入里程数(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

2 个答案:

答案 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,这种方法效果更好。

感谢所有人再次为其他用户推迟总结而道歉。