【问题标题】:OleDbDataAdapter fill datatableOleDbDataAdapter 填充数据表
【发布时间】:2012-04-30 19:11:36
【问题描述】:

关于填写OleDbDataAdapter的问题。

我有:

Dim cmd As OleDbCommand = New OleDbCommand(myQuery), myConnection)
Dim da As OleDbDataAdapter = New OleDbDataAdapter()
Dim dtDonnees As DataTable = New DataTable()
da.Fill(dtDonnees)

填充需要太多时间。
20 行需要 20 秒。
而对于 130 000,它需要更多的时间(但不是 130 000 秒)。
但无论如何,20 秒太长了。

为什么要花这么多时间?


问题第 2 部分:我可以跳过填充吗?

我的意思是,在填充数据表之后,我对数据表的每一行做一个并转换成一个实体:

Dim returnList As New List(Of myObject)(dtDonnees.Rows.Count)
For Each rowDonnee As DataRow In dtDonnees.Rows
   returnList.Add(New myObject(rowDonnee))'set every data of the row into my new object
Next

我可以通过OleDbDataAdapter的每一行吗?

【问题讨论】:

    标签: vb.net oledbdataadapter


    【解决方案1】:

    如果你想尝试,你可以用这个方法跳过DataAdapter填充(假设不需要DataTable)。不确定您能否在性能上获得很大提升。

    Dim cmd As OleDbCommand = New OleDbCommand(myQuery, myConnection) 
    Dim reader As OleDbDataReader = cmd.ExecuteReader()
    while reader.Read()
       returnList.Add(New myObject(reader))
    end while  
    

    当然,在你的对象的构造函数中,你应该读取数据并设置对象的内部状态

    Public Class myObject
    
       Dim myData As String
       ' other internal var to keep state of this object instance
    
       Public Sub New(ByVal reader as OleDbDataReader)
           myData = reader.GetString(0)
           ' read and initialize other internal data.
       End Sub
    End Class
    

    【讨论】:

    • 是的,这就是我得到的。但构造函数得到一个数据行,所以我设置 LocalVar = tryPars(myRow("columnX")).
    • 我认为读者也可以这样做。但是为什么你说那不会加快速度?
    • 在您的示例中,我们可以说我们有两个循环。一种用于填充 DataSet,另一种用于构造对象。使用 DataReader,我们删除了一个循环和数据表内行在内存中的缓存。不幸的是,datareader 没有简单的方法将其当前数据行转换为 DataRow,因此如果要使用此方法,则需要添加一个新的构造函数。关于速度。我不能说数据读取器是否加快了速度,您需要进行基准测试。构建和初始化实例的成本可能比 reader.read/adapter.fill 的成本更相关
    • 我会用我的 130000 个数据来做基准测试。也许这不会有太大帮助,它可能是最糟糕的。
    • @forX 我很好奇,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2015-01-01
    相关资源
    最近更新 更多