选择 N 条记录语句未返回正确的金额

Posted

技术标签:

【中文标题】选择 N 条记录语句未返回正确的金额【英文标题】:Select N records statement not returning correct amount 【发布时间】:2013-12-28 15:20:00 【问题描述】:

我正在使用 sql 语句连接到访问数据库并仅检索 100 条记录。但是,这将返回所有记录,而不是 100 条记录。如何限制要获取的记录。如果我直接在访问中运行此语句作为查询,它工作正常。

我在 vb.Net.Thanks 中使用 winforms

sql = "Select top 100 * from Requests ORDER BY [Date-time received] DESC"

vb.Net 代码

    Dim lvcount As Integer = 0
    'Dim tmpColor As Color = Color.Green

    Sub fillRequests()
        Try

            DBConnection.connect()

            sql = "Select top 100 * from Requests ORDER BY [Date-time received] DESC"

            Debug.Print(sql)

            Dim oledbCmd As OleDbCommand = New OleDbCommand(sql, oledbCnn)


            Using dr = oledbCmd.ExecuteReader()

                While dr.Read()
                    If dr.HasRows Then
                        Dim LVI As New ListViewItem

                        With LVI

                            .UseItemStyleForSubItems = False

                            .Text = dr(0).ToString()

                            .SubItems.Add(CDate(dr(5)).ToShortDateString)
                            .SubItems.Add(dr(1).ToString())
                            .SubItems.Add(dr(3).ToString())

                            If dr(3).ToString = "D" Then
                                .SubItems(3).Text = "Destruction"

                            ElseIf dr(3).ToString = "O" Then
                                .SubItems(3).Text = "Retrieval"

                            ElseIf dr(3).ToString = "I" Then
                                .SubItems(3).Text = "Intake"

                            ElseIf dr(3).ToString = "B" Then
                                .SubItems(3).Text = "Return"

                            ElseIf dr(3).ToString = "X" Then
                                .SubItems(3).Text = "Other"

                            ElseIf dr(3).ToString = "1" Then
                                .SubItems(3).Text = "Supply std boxes"

                            ElseIf dr(3).ToString = "G" Then
                                .SubItems(3).Text = "File Return"

                            ElseIf dr(3).ToString = "F" Then
                                .SubItems(3).Text = "File Retrieval"

                            ElseIf dr(3).ToString = "2" Then
                                .SubItems(3).Text = "Supply prt boxes"

                            End If


                            .SubItems.Add(dr(9).ToString())

                            If IsDBNull(dr(9)) Then
                                .SubItems(4).Text = "O/S"
                                .SubItems(4).ForeColor = Color.Red
                                'MessageBox.Show(.SubItems(4).Text)

                            ElseIf dr(9) IsNot "DEMO" Then
                                .SubItems(4).Text = "Done"

                            End If

                        End With
                        lvRequests.Items.Add(LVI)

                        lvcount += 1

                    End If

                End While
            End Using

            'autosize each column in listview

            For Each col As ColumnHeader In lvRequests.Columns
                col.Width = -2
            Next col

            'refresh the list with new data
            'lvRequests.Refresh()

            'Enable the posting previous button
            btnPreviousPostings.Enabled = False
            btnPreviousPostings.Text = "No data to show"
            oledbCnn.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            'dr.Close()
            'oledbCnn.Close()
        End Try

        'btnNextPostings.Enabled = ListView1.Items.Count > 100

        If (lvRequests.Items.Count < 100) Then
            btnNextPostings.Enabled = False
            btnNextPostings.Text = "No data to show"
        Else
            btnNextPostings.Enabled = True
            btnNextPostings.Text = "Next " & CStr(lvRequests.Items.Count - 1) & " Postings"
        End If

        'RESET LVCOUNT TO 0
        lvcount = 0

End Sub

【问题讨论】:

向我们展示您用于定义和执行查询的 VB 代码。 请查看更新后的代码。谢谢 您是否使用count 变量来确定返回的行数?如果是这样,它看起来像是一个模块/类级别的变量,并且您没有在循环之前将其设置为零。 我使用 Dim lvcount As Integer = 0 作为计数器。谢谢 然后我在循环外重置 lvcount = 0。 【参考方案1】:

来自office.microsoft.access.help

TOP 谓词不会在相等的值之间进行选择。

因此,如果您的所有记录在[Date-time received] 中具有相同的值,则查询返回所有行。

解决方法: 例如,如果您的表 Requests 中有 ID-field(或其他字段,但具有唯一值),则在 ORDER 中使用它

SELECT TOP 100 * FROM Requests ORDER BY [Date-time received] DESC, [ID] DESC

【讨论】:

法比奥,我想做的是一种分页。有很多记录,所以我需要将它们分成 100 个帖子。根据我的代码示例,如何捕获接下来的 100 条记录。谢谢 使用DataTable。用你的数据(所有行)填充它,然后你可以做你想做的事情,将所有行(数据)放在一个对象中 您是否有示例或帮助修改我的代码以实现此目的。我对 vb.net 还很陌生,但仍在寻找我的方式。谢谢 检查Retrieve DataTable 和Looping through DataTable。尝试如果堆栈在某个地方提出新问题(因为这个问题是关于另一件事的)【参考方案2】:

只是一种解决方法:如果不是大量数据,您可以将结果放入某个集合中,然后从该集合中获取前 100 项(我想使用 vb.NET 会很容易)并将其他项处理掉。

【讨论】:

以上是关于选择 N 条记录语句未返回正确的金额的主要内容,如果未能解决你的问题,请参考以下文章

laravel 检查金额是不是在记录之间

sql如何按条件把相同记录合并成一条记录?

SQL - 找到性能更好的第 n 个最高金额

[编程题] 微信红包

Authorize.Net Paypal Express PHP API:交易未在 Authorize.Net 中更新,也未捕获正确金额的问题

Apple Pay 令牌的交易金额不正确