RecordSet 对象是否应该在 VB.NET 中被取消?
Should RecordSet object be nulified in VB.NET?
我正在将旧的 VB6 应用程序转换为较新的 VB.NET 应用程序,并且在升级后经常看到这 3 行:
rs.Close()
'UPGRADE_NOTE: Object rs may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="6E35BFF6-CD74-4B09-9689-3E1A43DF8969"'
rs = Nothing
其中 rs 是 RecordSet 类型,如下所示:
Dim rs As ADODB.Recordset
rs = New ADODB.Recordset
应该是最后一个
rs = Nothing
线路还存在吗?或者
rs.Close()
够了吗?
使用 VB.Net,您几乎不会将对象设置为 Nothing
。这在 VB6 时代很常见,但对于 .Net 它不再有帮助,并且在极少数情况下可能会产生积极的危害。你应该做的是使用 Try/Catch/Finally 块的 Finally
部分(或 shorthand 的 Using
块)来确保实现 IDisposable
的对象接口有它们的 Dispose()
函数被及时调用,对于旧的 ADO 对象,Finally
块是调用 .Close()
的地方。您特别想为 ADO 连接对象执行此操作。
总而言之,rs = Nothing
行不应该存在,但 rs.Close()
本身也不够。
但这确实是一个附带问题。如果您要转换为 VB.Net,最好的办法是也从原始 ADO 转换为更现代的 ADO.Net,这更适合 VB.Net。这意味着首先使用 DataSet
和 DataReader
而不是 RecordSet。
最后,这也是检查您的查询并确保它们使用的是查询参数而不是字符串连接的好时机。希望您已经这样做了,但是那里有 很多 旧的和可怕的易受攻击的经典代码 ASP 和 vb6 代码,.Net 迁移是个好时机堵住那些洞。 Sql 注入可不是闹着玩的。
我正在将旧的 VB6 应用程序转换为较新的 VB.NET 应用程序,并且在升级后经常看到这 3 行:
rs.Close()
'UPGRADE_NOTE: Object rs may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="6E35BFF6-CD74-4B09-9689-3E1A43DF8969"'
rs = Nothing
其中 rs 是 RecordSet 类型,如下所示:
Dim rs As ADODB.Recordset
rs = New ADODB.Recordset
应该是最后一个
rs = Nothing
线路还存在吗?或者
rs.Close()
够了吗?
使用 VB.Net,您几乎不会将对象设置为 Nothing
。这在 VB6 时代很常见,但对于 .Net 它不再有帮助,并且在极少数情况下可能会产生积极的危害。你应该做的是使用 Try/Catch/Finally 块的 Finally
部分(或 shorthand 的 Using
块)来确保实现 IDisposable
的对象接口有它们的 Dispose()
函数被及时调用,对于旧的 ADO 对象,Finally
块是调用 .Close()
的地方。您特别想为 ADO 连接对象执行此操作。
总而言之,rs = Nothing
行不应该存在,但 rs.Close()
本身也不够。
但这确实是一个附带问题。如果您要转换为 VB.Net,最好的办法是也从原始 ADO 转换为更现代的 ADO.Net,这更适合 VB.Net。这意味着首先使用 DataSet
和 DataReader
而不是 RecordSet。
最后,这也是检查您的查询并确保它们使用的是查询参数而不是字符串连接的好时机。希望您已经这样做了,但是那里有 很多 旧的和可怕的易受攻击的经典代码 ASP 和 vb6 代码,.Net 迁移是个好时机堵住那些洞。 Sql 注入可不是闹着玩的。