Vb.net 如何将SQL数据库最后一行的选定单元格值放入两个标签中?

Vb.net 如何将SQL数据库最后一行的选定单元格值放入两个标签中?,vb.net,Vb.net,从SQL数据库加载表单时,我试图将最后一行的选定列中的值放入标签1和标签2。我的代码不起作用。我该怎么做? 我的代码在这里: Private Sub getvalue() Dim strConn = "server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true" Dim sqlConn = New SqlConnection(strConn) sqlCon

从SQL数据库加载表单时,我试图将最后一行的选定列中的值放入标签1和标签2。我的代码不起作用。我该怎么做? 我的代码在这里:

Private Sub getvalue()
    Dim strConn = "server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true"
    Dim sqlConn = New SqlConnection(strConn)

    sqlConn.Open()

    Dim sqlcmd As New SqlCommand("select 22ktrate, 21ktrate from ratedata where max(rateid) = @rateid", sqlConn)
    Dim myreader As SqlDataReader

    myreader = sqlcmd.ExecuteReader()
    myreader.Read()

    If myreader.HasRows Then
        Label1.Text = myreader.Item("22ktrate")
        Label2.Text = myreader.Item("21ktrate")
    End If

    sqlConn.Close()
End Sub

实际上,我可以看到您已经在使用阅读器来检查它是否有行。 只需在读取器读取后设置最后一个值

这假设SQL查询的排序依据是正确的(
asc
desc

更改此部分: myreader=sqlcmd.ExecuteReader()


我注意到的一件大事是没有设置
@rateid
参数

Private Sub getvalue()
    Dim conn As String = "server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true"
    Dim sql As String = "select [22ktrate], [21ktrate] from ratedata where max(rateid) = @rateid"

    Using sqlConn As New SqlConnection(conn), _
          sqlcmd As New SqlCommand(sql, sqlConn)

        'This was missing. You need to know what to set for 1234 here.
        'I suggest adding it as argument to the method.
        sqlcmd.Parameters.Add("@rateid", SqldbType.Int).Value = 1234

        sqlConn.Open()   
        Using myreader As SqlDataReader = sqlcmd.ExecuteReader()
            If myreader.Read() Then
                Label1.Text = myreader("22ktrate").ToString()
                Label2.Text = myreader("21ktrate").ToString()
            End If
        End Using
    End Using
End Sub
我还对代码进行了其他结构更改,您应该遵循这种新模式。问题中的原始代码有几个不太明显的问题,这些问题最终可能导致用户面临的问题,例如在抛出异常时无法关闭连接

最后,我在评论中看到了这一点:

我只需要最后一行从sql数据库中选择两个列值


该select语句中没有ORDER BY子句。如果没有ORDERBY子句,则行的顺序是未定义的,Sql Server可以按照它认为方便的任何顺序为您提供行。“最后一行”没有有意义的定义。如果这很重要,您必须将ORDERBY子句添加到sql语句中。。。在这一点上,最好反转顺序,只获取第一条记录,而不是迭代整个结果集。如果没关系的话。。。与迭代整个集合相比,只获取第一行更好。在任何一种情况下,您都可以向SQL命令中添加一个TOP 1—如果可能有多条记录与
max(rateid)

匹配,则必须迭代所有行,获取所需列的值并将其添加到标签中。实际上,您可以使用
而reader.read()
我的表单没有数据网格。我只需要最后一行中两个从sql数据库中选择的列值,格式为两个标签。等等。。你能澄清一下你所说的
最后一行两个选定列是什么意思吗?用户必须选择什么?没有ORDERBY子句,这意味着上下文中的“last”未定义。如果您在结果中获得多条记录,那么您也可以选择第一条记录。“2”在Unicode中作为标识符“22ktrate”的一个字母,还是需要方括号?@AndrewMorton它可能需要方括号。它们当然不会造成伤害,所以我会将它们添加到答案中。我尝试过-方括号肯定是必需的。这听起来像是他根据评论提出的要求,但我不确定这是否正确,因为sql中的max(rateid)=@rateid可能会将结果中的这一项限制为一条记录。此外,根本没有orderby子句,意思是“last”完全没有定义。因此,即使这是他想要的,他仍然需要添加一个ORDER BY子句,在这一点上,他最好只是颠倒顺序,只读取第一条记录。@JoelCoehoorn这是真的。。既然我试过了,就给我一块饼干吧P
While myreader.Read()
   Label1.Text = myreader.Item("22ktrate")
   Label2.Text = myreader.Item("21ktrate")
End While

sqlConn.Close()
Private Sub getvalue()
    Dim conn As String = "server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true"
    Dim sql As String = "select [22ktrate], [21ktrate] from ratedata where max(rateid) = @rateid"

    Using sqlConn As New SqlConnection(conn), _
          sqlcmd As New SqlCommand(sql, sqlConn)

        'This was missing. You need to know what to set for 1234 here.
        'I suggest adding it as argument to the method.
        sqlcmd.Parameters.Add("@rateid", SqldbType.Int).Value = 1234

        sqlConn.Open()   
        Using myreader As SqlDataReader = sqlcmd.ExecuteReader()
            If myreader.Read() Then
                Label1.Text = myreader("22ktrate").ToString()
                Label2.Text = myreader("21ktrate").ToString()
            End If
        End Using
    End Using
End Sub