如果想用类的方式模拟ADO的recordset结构。    我的类库的结构:    Recordset  '类
      │
      └─ Records '集合
            │
            └─ Record '类
                  │
                  └─ Fields  '集合
                        │
                        └─ Field  '类
                              │
                              ├─ Value      '属性
                              │
                              └─ FieldType  '属性
                              │
                              └─ FieldSize  '属性              比如"Recordset"类中包括"Record"集合,每个"Record"表示一条记录,"Record"类中包括"Fields"集合。"Field"类中有表示字段的特征的各个属性,如value、fieldtype、FieldSize、underlyingvalue等等。    现在遇到的问题是,如果fieldtype、FieldSize、underlyingvalue等这些属性,我把它们放在"Field"类中的话,岂不是每个"Record"中我都要给它们赋值一次?是不是太浪费了?因为这些属性对于同一个recordset来讲,值都是相同的。但是,如果放在"Recordset"类中,似乎又不可能。因为fields的数目是不确定的。    想看看大家是怎么解决这个问题的。    谢谢回复。顶也有分。

解决方案 »

  1.   

    fieldtype、FieldSize、underlyingvalue等这些属性,我把它们放在"Field"类这样比较合理,毕竟这些是属于Filed类所有的ado的recordset也是这样的,如果值是相同的,可以给一个默认值
      

  2.   


        相关的问题:在ADO对象模型中, recordset可以直接访问fields集合,即使recordset中没有任何记录。
        而在我上面那样建立的类库的模型中,如果recordset的records集合中,没有任何成员的话,就无法在recordset中访问fields。更不用说field中的属性了。
        这个该怎么解决呢?
      

  3.   

    不用 ADO 自己做,你老板钱多没处花?不如分我一点。
      

  4.   

    注意:对一个 100 条记录× 5 个字段的 RecordSet,只有 5 个 Field 字段,RecordSet 的 Move 对象做的是让没有 Field 当前的“游标”指向对应的数据。Record 对象并不包含在 RecordSet 中。
    应该可以省下许多对象吧。
      

  5.   

    Tiger_Zhao(TigerZhao(VB老鸟)) :     你说的我不是很明白。 
        “move对象”,move不是对象吧?
        “让没有 Field 当前的‘游标’指向对应的数据。”如果用类与对象的观点来看,你说的“数据”是指放在什么地方的数据?
        “Record 对象并不包含在 RecordSet 中。”这句话也不好理解。
        “应该可以省下许多对象吧。”实在不明白。能不能整一个示意图来看看?或者写一点示例代码看看?谢谢。
      

  6.   

    Private con As Connection
    Private com As Command
    Private rst As Recordset
    Private ErrDesc As StringPublic Parameters As New CParametersPublic Property Get ErrDescription() As StringErrDescription = ErrDescEnd PropertyPublic Property Set Connection(cn As Connection)
           Set con = cn
    End Property
    Public Function ExecuteStoredProcedure(StoredProcName As String, rs As Recordset) As Boolean
           Dim i As Long
           
           ErrDesc = "没有错误"
           If con Is Nothing Then
              ErrDesc = "没有设置Connection对象"
              ExecuteStoredProcedure = False
              Exit Function
           End If
           
           If Len(StoredProcName) = 0 Then
              ErrDesc = "没有设置存储过程的名字"
              ExecuteStoredProcedure = False
              Exit Function
           End If
           
           On Error GoTo ErrHandle
           
           Set com = New Command
           com.ActiveConnection = con
           com.CommandType = adCmdStoredProc
           com.CommandText = StoredProcName
           
           For i = 1 To Parameters.Count
               
               com.Parameters(Parameters.Item(i).name) = Parameters.Item(i).value
                         
           Next
           
           
          
               
           Set rst = com.Execute()
           If Not (rst Is Nothing) Then
              Set rs = rst
           End If
           
           ExecuteStoredProcedure = True
           Exit Function
    ErrHandle:
           
           ErrDesc = Err.Description
           ExecuteStoredProcedure = False
           
              
    End Function
      

  7.   

    flyingZFX(★我飞★我飞★我飞呀飞★) :答非所问。谢谢顶帖。
      

  8.   

    Tiger_Zhao(TigerZhao(VB老鸟)) 说得对,ADO有游标的概念。
    整个RS可以看成是一个网格,你的Record即行,Field即列。
    你这种模式,可以考虑在Recordset下面添加一个Columns(名字自己定)集合类,每个Column有列的固定属性,比如Name、FieldType、FieldSize等等,而Field下面除了Value等单元格属性之外,只需要建立一个对Column的引用即可,不会耗太多空间。
    个人看法,仅供参考:)
      

  9.   

    hedane(有球必应);    能不能把主要的代码写出来看看? 还有,你说的field是什么?也是一个类吗?与recordset是什么关系?
      

  10.   

    我建议用OO方法实现。
    你可以先设计类图吗!
    比如每个Record都是Recordset的一个对象。
      

  11.   

    我所指的Field就是你所指的Field。需要强调的一点,一个类库的结构通常应该指外部看到的结构,而不是具体实现的结构。在你的基础上修改如下,要求Columns和Fields的数量保持一致。Recordset  '类
          │
          ├─ Columns '集合
          │    │
          │    └─ Column '类
          │          │
          │          ├─ FieldType  '属性
          │          │
          │          └─ FieldSize  '属性            
          │
          └─ Records '集合
                │
                └─ Record '类
                      │
                      └─ Fields  '集合
                            │
                            └─ Field  '类
                                  │
                                  ├─ mColumn    '私有或友元,初始时直接引用对应的Column
                                  │
                                  ├─ Value      '属性
                                  │
                                  ├─ FieldType  '属性(没有存储部分,使用mColumn的属性)
                                  │
                                  └─ FieldSize  '属性(没有存储部分,使用mColumn的属性)
      

  12.   

    hedane(有球必应),谢谢再次关注。我回头试试写出代码。