提问人:Nnek Lecxe 提问时间:9/25/2023 最后编辑:Ken WhiteNnek Lecxe 更新时间:9/25/2023 访问量:79
使用超过 2000+ 条记录数据库快速加载的替代方法
alternative way to load fast with more than 2000+ records database
问:
关于如何使用具有 2000+ 的记录更快地加载,是否有任何建议/建议?
加载数据时,系统在加载更多数据时似乎会冻结一秒钟。基本上我想要的是等待进度条完成加载所有数据记录或其他东西
Sub loadcheck()
DataGridView1.Rows.Clear()
Try
conn.Open()
Dim cmd As New OleDbCommand("select * from tblstore ORDER by storecode, check_date, ID ASC", conn)
dr = cmd.ExecuteReader
While dr.Read
DataGridView1.Rows.Add(dr.Item("ID"), dr.Item("storecode"), dr.Item("check_date"), dr.Item("check_num"), dr.Item("check_name"), dr.Item("check_memo"), dr.Item("check_amount"), dr.Item("date_release"), dr.Item("date_deposit"), dr.Item("status"))
End While
dr.Dispose()
Catch ex As Exception
MsgBox(ex.Message)
End Try
conn.Close()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
loadcheck()
End Sub
Private Sub manageCheck_Load(sender As Object, e As EventArgs) Handles MyBase.Load
managesupplier.BackgroundWorker1.RunWorkerAsync()
Control.CheckForIllegalCrossThreadCalls = False
End Sub
答:
3赞
jmcilhinney
9/25/2023
#1
正如注释中建议的那样,您应该使用数据绑定。始终绑定数据,除非您有特定原因需要这样做。如果你不知道你是否有具体的原因,你就不知道。
在这种情况下,如果需要,您仍然可以使用 检索数据,尽管您甚至可能不需要这样做。不过,您绝对必须在 UI 线程上填充网格。BackgroundWorker
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Using connection As New OleDbConnection("connection string here"),
command As New OleDbCommand("SQL query here", connection)
connection.Open()
Using reader = command.ExecuteReader()
Dim table As New DataTable
table.Load(reader)
e.Result = table
End Using
End Using
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Dim table = DirectCast(e.Result, DataTable)
DataGridView1.DataSource = table
End Sub
请注意,使用块来正确处理所有一次性物品。如果您不修改和保存数据,则可以使用数据读取器。如果要进行更改,请改用数据适配器,它可以双向移动数据。Using
实际上,在我看来,该属性无论如何都是类型,因此无需强制转换:DataSource
Object
e.Result
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
DataGridView1.DataSource = e.Result
End Sub
评论
0赞
Nnek Lecxe
9/25/2023
使用该代码,是否还可以填充 DataGridView 的列?就像我想自定义标题文本并仅显示我想要的列一样。我更熟悉我当前的填充 loadcheck 设置,因此我当前代码使用 backgroundworker 实现的任何解决方法。
0赞
jmcilhinney
9/25/2023
@NnekLecxe,如果您只需要某些列,则应在查询中指定这些列,而不是使用“select *”。还可以在设计器中创建网格列,并设置其 DataPropertyName 属性,以指定要绑定到的数据源属性。
0赞
HardCode
9/25/2023
您还可以通过在设置BackgroundWorker1_RunWorkerCompleted()
.DataSource
DataGridView1.Columns(0).HeaderText = "Foo"
DataGridView1.Columns(1).HeaderText = "Bar"
0赞
Nnek Lecxe
9/26/2023
我目前只能通过代码手动设置我的 datagridview。我有准备好的带有指定标题的 datagridview(以及一些我不需要的隐藏标题),但我对如何加载我的新数据表有些迷茫。它似乎将新 ID 等从数据库重新填充到数据网格。带有现成标头的 datagridview 变得毫无用处。它不会从 datagridiview 加载到我的标题下
0赞
jmcilhinney
9/26/2023
@NnekLecxe,如果您添加的列未填充,则一定没有按照已指示执行操作。您需要设置每列的 ,以告诉他们要绑定到数据源的哪个列/属性。仅添加所需的列,按照说明配置其绑定,然后在网格上设置为在设置 .现有网格列将绑定到指定的数据源列/属性,并且不会生成其他列。DataPropertyName
AutoGenerateColumns
False
DataSource
评论
DataTable
DataGridView.DataSource
CheckForIllegalCrossThreadCalls
False