vb.net - 什么会导致我的数据集删除一行?
问题描述
我有一个 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,并被告知要坚持使用它们,因为我们的其他项目使用它们。
解决方案
您的代码已经使用 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
推荐阅读
- python - 带有 GUI 的手写数字识别
- mapping - 我们是否能够从机器人车队经理那里提取地图信息?
- visual-studio - 启用空安全时,默认“列表”构造函数不可用
- sql - 如何在 presto 中首先运行子查询
- python - 如果响应状态不是 200 并且它处于并发期货会话中,我将如何循环 HTTP 请求?Python
- php - PHP 替换倍数 \r\n 为
- hibernate - Hibernate 的 session.save 如何代理一个瞬态对象?
- flutter - 将 'obscureText' 标志设置为 true 会使文本字段在它们没有聚焦时清晰 - 为什么?
- odoo - 如何在odoo v10中将“day, hh:mm:ss”格式转换为hh:mm
- c - 在 C 中创建一个字符串后,我试图将其内容复制到该字符串的文件在我实际告诉它之前执行此操作