首页 > 解决方案 > 什么会导致我的数据集删除一行?

问题描述

我有一个 SQL 语句,当在 SSMS 中运行时,它返回 6 行。将语句附加到命令类型为 Text 的 VB.NET SQLCommand 的命令文本后,使用 SqlDataReader 读取并附加到数据集后,返回的数据集只有 5 行。

起初,我认为这是数据的问题。但是,在多次删除和添加具有不同数据的源表的行之后,很明显我总是得到总行数 - 1。然后我决定只使用 SQLDataAdapter 来填充 DataSet 和适当数量的行被返回。

Dim ds As New DataSet
Dim sqlCmd as New SqlCommand
Dim sqlCn As New SqlConnection
Dim sqlR As New SqlCommand

sqlCn.ConnectionString = "SomeConnectionString"

With sqlCmd.CommandText = "Select * from DummyTable"
           .CommandType = CommandType.Text
           .Connection  = sqlCn
End With

sqlCn.Open()
sqlR = sqlCmd.ExecuteReader
sqlR.Read()

If sqlR.HasRows() Then
    ds.Tables.Add("DummyTable")
    ds.Tables(0).Load(sqlR)
    return ds
End If

从这里,我期待看到 DummyTable 中的 6 行。相反,我只看到 5 个。

但是,如果我使用以下内容:

Dim da as SqlDataAdapter
Using sqlCn
    da.SelectCommand = New SqlCommand(sqlCmd.CommandText, sqlCn)
    da.Fill(ds)
End Using
Return ds

我得到了完整的 6 行。关于 DataSet 的 Tables.Add(tableName) 或 Tables(n).Load(dataReader) 的工作方式,我有什么遗漏吗?在此之前我从未使用过 SqlDataReaders,并被告知要坚持使用它们,因为我们的其他项目使用它们。

标签: vb.net

解决方案


您的代码已经使用 sqlR.Read() 行读取查询的第一行。此行在您的代码中是不必要的。删除它,它会正常工作。

SqlCommand、SqlConnection 和 SqlDataReader 也实现了 iDisposable,所以一定要对它们使用 using 语句:

Using sqlCn As New SqlConnection("SomeConnectionString")
  sqlCn.Open()
  Using sqlCmd as New SqlCommand
       With sqlCmd.CommandText = "Select * from DummyTable"
           .CommandType = CommandType.Text
           .Connection  = sqlCn
       End With

       Using sqlR As SqlDataReader = sqlCmd.ExecuteReader
          If sqlR.HasRows() Then
             Dim ds As New DataSet 
             ds.Tables.Add("DummyTable")
             ds.Tables(0).Load(sqlR)
             return ds
          End If
       End Using
  End Using
End Using   

推荐阅读