这是我自问的理论问题。 我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
答案 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));
}
}
}