首页 > 解决方案 > 如何将 SQL 数据库中最后一行的选定单元格值放入两个标签中?

问题描述

当表单从 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

标签: vb.net

解决方案


我注意到的一件大事是没有设置@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 数据库中选择最后一行两个选定的列值

该选择语句中没有 ORDER BY 子句。如果没有 ORDER BY 子句,行的顺序是未定义的,Sql Server 可以自由地以它认为方便的任何顺序为您提供行。“最后一行”没有有意义的定义。如果这很重要,您必须在 sql 语句中添加一个 ORDER BY 子句......此时,您最好颠倒顺序并仅获取第一条记录,而不是迭代整个结果集。如果没关系......你最好只取第一行而不是迭代整个集合。在任何一种情况下,您还可以在 SQL 命令中添加 TOP 1 — 如果甚至可能有多个记录匹配max(rateid).


推荐阅读