【问题标题】:Recordset .value property记录集 .value 属性
【发布时间】:2013-10-05 17:08:34
【问题描述】:

请参阅下面的 DDL:

CREATE TABLE TestDate (bookingdate datetime)
INSERT INTO TestDate VALUES ('2013-10-04')

请查看下面的 ADODB 记录集:

rs.open "SELECT bookingdate FROM TestDate"
If rs("bookingdate") > dateadd("yyyy", -6, Now)
  msgbox("test")
end if

指定rs("bookingdate")rs("bookingdate").value 有什么区别。我在这里阅读了一些问题,回答者说总是使用 .value,但没有解释原因。我在 MSDN 上看了看,但找不到答案。

【问题讨论】:

  • “为什么”与任何使用默认属性的风险因素相同。人们会愉快地忽略这一点,并在 100 次中有 99 次侥幸逃脱,然后第 100 次就被一个很难诊断的错误咬住了。

标签: vb6


【解决方案1】:

ValueField对象的default property,所以在VB6中rs("bookingdate")rs("bookingdate").valuewhen used without Set没有区别。

我个人不喜欢使用不带参数的默认属性。它使代码less confusing IMO。

在VB.NET中默认属性必须有参数,所以这种情况不会发生。
注意Recordset 具有这样的带参数的默认属性,并且您正在使用它来返回Field 对象:rs("bookingdate") 实际上是rs.Item("bookingdate")。使用这些,IMO,没有害处。

【讨论】:

  • SET 涉及根据您的链接操作引用。对吗?
  • @w0051977 是的,它涉及操纵引用。例如。你可以声明一个变量f 类型为FieldSet f = rs("bookingdate")
  • 不正确。在很多情况下Set 不是一个因素,例如任何时候将表达式作为参数传递给某个过程。
  • @Bob77 虽然传递参数是另一回事,与分配变量几乎没有关系,但它也可能使用或不使用默认属性(这也会增加混乱)。如果您将表达式 rs("bookingdate") 传递给接受 FieldObjectVariant 参数的过程,则将传递 Field 对象。如果您将相同的表达式传递给接受例如String 参数,编译器将调用 rs("bookingdate").Value 并传递它。
  • 似乎每个人都想设计例子来证明懒惰地依赖默认属性是一件健康的事情。它不是,也从来不是推荐的做法。它使任何人(包括编译器)都更难知道它的意图。但是...您始终可以选择这样做,但这并不是一种好的做法。
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 2017-10-14
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多