如何将SQL数据库中最后一行的选定单元格值分成两个标签?

时间:2018-12-11 19:38:08

标签: 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)

    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

2 个答案:

答案 0 :(得分:2)

我注意到的最大问题是没有设置@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子句。如果没有ORDER BY子句,则行的顺序是不确定的,并且Sql Server可以自由地以您认为方便的任何顺序为您提供行。 “最后一行”没有有意义的定义。如果这很重要,则必须在sql语句中添加ORDER BY子句...此时,最好反转顺序,而只记录 first 记录,而不是迭代整个结果集。如果没关系...最好还是走第一行而不是遍历整个集合。无论哪种情况,您都可以在SQL命令中添加TOP 1-如果甚至有可能有多个记录与max(rateid)相匹配。

答案 1 :(得分:0)

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

这假设您的SQL查询的Order by是正确的(ascdesc

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

myreader.Read()

If myreader.HasRows Then

    Label1.Text = myreader.Item("22ktrate")
    Label2.Text = myreader.Item("21ktrate")


End If

sqlConn.Close()

While myreader.Read()
   Label1.Text = myreader.Item("22ktrate")
   Label2.Text = myreader.Item("21ktrate")
End While

sqlConn.Close()