选择 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 条记录语句未返回正确的金额的主要内容,如果未能解决你的问题,请参考以下文章
Authorize.Net Paypal Express PHP API:交易未在 Authorize.Net 中更新,也未捕获正确金额的问题