在这段代码中,编写者对记录集对象进行了引用,我只想在继续之前确保理解为什么。
Private Sub LoadDataBound()
Set rs = GetData
If Not rs.EOF Then
Set dgPend.DataSource = rs ' Bind the Datagrid to the recordset
dgPend.Refresh
dgPend.AllowUpdate = True
Else
MsgBox "No Records Found in DataGrid!"
End If
'Call Bind_Contols
'Call End_Time
End Sub
Private Function GetData() As ADODB.Recordset
sWhichDataType = UCase(Trim(sWhichDataType))
Select Case sWhichDataType
Case "ADS"
sSource = "\\development\brakechecktables\speedwrench.add"
Set GetData = OpenADS
Case "SQL"
sSource = "development"
Set GetData = OpenSQL
Case "FOX"
sSource = "E:\Yes30\Data\speedwrench\"
Set GetData = OpenFOX
Case Else
MsgBox "Invalid DataSet Selected"
End Select
End Function
在LoadDataBound中,它表示设置rs = GetData()。这将调用下面的函数,但为什么需要将其设置为rs记录集的对象。在这里纠正我,因为我很可能是错的,但它是否需要这样才能使你能够从记录集中创建一个函数而不必为两者(记录集和函数)使用相同的名称?或者是否有另一个进程在这里,我不知道。
答案 0 :(得分:1)
我很乐意帮助您理解代码,但我真的无法理解您的问题以及您的困惑是什么。您似乎对变量,对象和方法(函数和子例程)的含义,差异和目的感到困惑。代码相当简单易懂,所以我猜你的问题是你不熟悉编程。代码看起来不是很好,这可能是你困惑的一部分。它看起来并不是很好,但它并不完全可怕。我当然看得更糟。
因此,假设我的假设是正确的,让我首先解释变量,对象和方法,然后我将简要解释代码正在做什么。如果这没有回答你的问题,请澄清。
变量是最简单的概念。它是存储在内存中的值的命名引用。在代码中,rs
是一个变量。每个变量都有一个类型,因此它们只能设置为与该类型兼容的值。您没有显示声明rs
变量的代码,所以我只是假设它被声明为ADODB.Recordset
的类型,例如:
Private rs As ADODB.Recordset
另一方面,一个物体略有不同。对象是类型的实例。 RecordSet
是一种对象,但它本身不是对象。可能会创建许多相同类型的对象。每个对象通常独立于相同类型的所有其他对象(尽管它们在某些情况下可以共享数据)。变量引用的值始终是某种类型的对象。许多变量可以引用同一个对象,但每个对象至少由一个变量引用。如果一个对象不再被任何变量引用,它可能会在内存中存在一段时间,但它最终会被垃圾收集器破坏。变量不必引用任何对象。它可以改为引用Nothing
。例如:
rs = New ADODB.RecordSet() 'rs now references a RecordSet object
rs = Nothing 'rs now references no object at all
New
运算符是创建新对象的原因。对象没有名称(除非它们以某种方式自己实现),所以即使上面的变量被称为rs
,它也不是对象的名称。例如,我可以这样做:
rs = New ADODB.RecordSet()
temp = rs
在此示例中,temp
和rs
现在都引用同一个对象,而在一个对象中所做的更改将自动反映在另一个对象中。因此,rs和temp不是对象本身的名称。它们只是引用它的变量的名称。
方法是一个逻辑组,希望是封装的代码,它被赋予一个名称,并且可以随时使用该名称调用。方法可以选择性地获取参数列表,并且可以选择性地返回单个值。在VB中,如果方法返回一个值,则称为Function
,如果它没有返回值,则称为Sub
例程。
我不会纠缠于此,因为我不想让你迷惑,但到目前为止我所说的一切都是参考类型,而不是价值类型。基本上,引用类型通常是更复杂的对象类型,它们存储更多数据并且通常是可变的。值类型通常更简单,更小,更不可变。两个变量可以引用相同的引用类型对象,但它们不能使用值类型对象(例如Integer)来执行此操作。
您的代码包含一个名为GetData
的方法。这是作为一种方法的原因可能是双重的。首先,作者可能已将其作为一种方法,因为他打算从代码中的多个位置调用它。在这种情况下,制作一个完成工作的方法总是一个好主意,这样你就不会在多个地方复制相同的代码。其次,作者可能只是想让它成为一种使代码更易于阅读的方法。而不是将所有代码直接放入LoadDataBound
方法,并且需要在代码中添加注释,表示该部分代码正在获取数据,而不是简单地将其分解为单独的方法称为GetData,然后它自我记录。
GetData
方法不接受任何参数并返回新的ADBDB.RecordSet
对象。在GetData
方法中,它调用OpenADS,OpenSQL或OpenFOX,这些方法必须创建新的RecordSet对象并用数据库中的值填充它。
LoadDataBound
方法从数据库获取数据,然后使用数据绑定在表单上加载控件。它做的第一件事是调用GetData
方法创建一个新的RecordSet对象,用数据填充它,然后将该新对象返回给LoadDataBound
方法。 LoadDataBound
方法设置rs
变量以引用GetData
返回的新RecordSet对象。
然后LoadDataBound
方法检查GetData
返回的RecordSet对象是否包含任何数据。如果是,则将该数据加载到控件中,否则显示一个消息框。