DataAdapter:是否可以填充Collection-Type而不是DataTable / DataSet?

时间:2010-08-04 11:10:19

标签: .net vb.net performance ado.net collections

这是我自问的理论问题。 我remembered有序列表的二元搜索(一般是集合)比查找带有主键值Datatable.Rows.Find or DataTable.FindByPK的行更快。

因此,我在共享构造函数中填充数据库中的数据表,然后立即填充包含该表中所有主键的List(Int32)。稍后我将检查BinarySearch是否包含主键值。但是因为无论如何数据表只包含PK-Column,我问自己是否有办法避免填充数据表的巨大开销,然后将所有行添加到List。 是否可以直接从Dataadapter填充通用List(或其他集合类型)而不是Datatable / Dataset? 也许我已经离开赛道了,还有另一种方法可以避免我缺少的额外循环。

在强类型数据集和List中填充DataTable的代码:

   Private Shared w205CorrectSWUpgrades As New List(Of Int32)

   Shared Sub New()
        Dim da As New dsDatabaseTableAdapters.W205SWUpgradesTableAdapter
        For Each row As dsDatabase.W205SWUpgradesRow In da.Get_W205CorrectSWUpgrades.Rows
           w205CorrectSWUpgrades.Add(row.idData)
        Next
    End Sub

更新: 为了完整起见我的解决方案(感谢TheCloudlessSky): 因为DataAdapter本身使用DataReader来填充数据表或数据集,所以最好的方法是使用新函数扩展(来自VS)生成的DataAdapter的部分类,该函数返回直接从数据库填充的List(Int32)。请记住,此分部类必须位于生成的类之外的其他文件中,否则您的源代码将被数据集中的更改覆盖。还要记住,它必须位于同一个命名空间(以TableAdapters结尾),当然也有相同的名称。

 Namespace dsDatabaseTableAdapters
    Partial Public Class W205SWUpgradesTableAdapter

        Public Function GetListOfW205CorrectSWUpgrades() As System.Collections.Generic.List(Of System.Int32)
            Dim list As New System.Collections.Generic.List(Of System.Int32)
            Dim command As System.Data.SqlClient.SqlCommand = Me.CommandCollection(0)   

            Dim previousConnectionState As System.Data.ConnectionState = command.Connection.State
            Try
               If ((command.Connection.State And Global.System.Data.ConnectionState.Open) _
                        <> Global.System.Data.ConnectionState.Open) Then
                   command.Connection.Open()
               End If
               Using reader As System.Data.SqlClient.SqlDataReader = command.ExecuteReader
                   While reader.Read
                      list.Add(reader.GetInt32(0))
                   End While
               End Using
            Finally
                If (previousConnectionState = System.Data.ConnectionState.Closed) Then
                    command.Connection.Close()
                End If
            End Try

            Return list
        End Function

    End Class
End Namespace

现在业务逻辑和数据访问层仍然严格分开(在单独的项目中):

    Private Shared w205CorrectSWUpgrades As List(Of Int32)

    Shared Sub New()
        Dim da As New dsDatabaseTableAdapters.W205SWUpgradesTableAdapter
        w205CorrectSWUpgrades = da.GetListOfW205CorrectSWUpgrades
    End Sub

1 个答案:

答案 0 :(得分:4)

为什么不使用DataReader代替,因为这非常简单?在C#中,您将执行以下操作:

List<int> primaryKeys = new List<int>();

using (SqlConnection conn = new SqlConnection("your connection string"))
{
    SqlCommand command = new SqlCommand("SELECT Id FROM Table", conn);

    using (SqlDataReader reader = command.ExecuteReader())
    {
        // Loop through each record.
        while (reader.Read())
        {
            primaryKeys.Add(reader.GetInt32(0));
        }
    }
}