Vb6 将列附加到ADO记录集

Vb6 将列附加到ADO记录集,vb6,ado,Vb6,Ado,我试图在VB6中将列添加到ADO记录集中。我只想在表的末尾添加4列。这是一个我们经常使用的表,但我们经常删除其中的所有数据,并用我们想要的下一个信息重新填充它,基本上只是将其用作暂时保存数据的手段 我发现,由于是ADO,我应该能够使用以下内容: with rs .fields.append "column name", "enum dataType" end with 从阅读和实验来看,似乎必须关闭记录集才能添加列 这是我的密码: rs.Open "MeterReads", Da

我试图在VB6中将列添加到ADO记录集中。我只想在表的末尾添加4列。这是一个我们经常使用的表,但我们经常删除其中的所有数据,并用我们想要的下一个信息重新填充它,基本上只是将其用作暂时保存数据的手段

我发现,由于是ADO,我应该能够使用以下内容:

 with rs
     .fields.append "column name", "enum dataType"
 end with
从阅读和实验来看,似乎必须关闭记录集才能添加列

这是我的密码:

rs.Open "MeterReads", DataEnvironment7.cnPTracker, adOpenStatic, adLockOptimistic, adCmdTable
' 2019-11-4 Adding in a section to accomadate for days to depeletion
If gbEnableD2D Then
    bExists = False
    With rs
        For Each fField In rs.Fields
            If UCase(fField.Name) = UCase("eddB") Then
                bExists = True
                Exit For
            End If
        Next
        If bExists = False Then
            .Close
            .Fields.Append "eddB", adDate
            .Fields.Append "eddC", adDate
            .Fields.Append "eddM", adDate
            .Fields.Append "eddY", adDate
            .Open
        End If
    End With
End If

我希望有更多的列添加到我的表中。然而,我可以看看桌子,发现它们不在里面。我可以看到,因为我已经关闭了记录集。它尝试将列附加到它。但是,我重新打开记录集,这些列将从表中消失。当我说它们出现时,我指的是使用Microsoft Visual Basic的调试系统。它基本上有一个显示变量的部分,对于对象,它显示了里面的项目和更多的信息。所以我知道它试图这样做。但我似乎无法让它保留下来。如果您想修改数据库中表的结构,可以使用Microsoft ADO Ext.6.0 for DDL和安全库(从“项目”菜单>“引用”将其添加到项目中),这将是非常棒的。通过遍历Catalog对象的Tables集合,可以找到要修改的表。首先创建目录对象:

Dim objCatalog As ADOX.Catalog

' Create and Open Catalog
Set objCatalog = New ADOX.Catalog
Set objCatalog.ActiveConnection = DataEnvironment7.cnPTracker
我假设
DataEnvironment7.cnPTracker
是您当前的ADO连接对象

然后遍历表:

Dim objTable As ADOX.Table
Dim sTableName As String

sTableName = "Customers"

' Check if Table exists
For Each objTable In objCatalog.Tables

    If objTable.Name = sTableName Then
        ' Table found, return reference
        Exit For
    End If

Next
然后,一旦获得该表,就可以遍历Columns集合以查看它是否存在:

Dim objColumn As ADOX.Column
For Each objColumn In objTable.Columns
最后,如果找不到该列,可以添加它:

Set objColumn = New ADOX.Column
With objColumn
    .Name = "FieldName"
    .DefinedSize = 200
    .Type = adVarChar
End With

' Append the new field
objTable.Columns.Append objColumn

一种方法是在打开记录集时通过修改检索数据的方式来添加列。不要将
rs.Open
与adCmdTable一起使用,而是将adCmdText与
SELECT
语句一起使用

SELECT *, NULL AS eddB, NULL AS eddC, NULL AS eddM, NULL AS eddY FROM MeterReads

我确实发现,为打开的记录集或设置了ActiveConnection属性的记录集调用fields.Append方法会导致运行时错误。只能将字段附加到未打开且尚未连接到数据源的记录集。通常,这些是使用CreateRecordset方法或通过将新记录集对象显式指定给对象变量创建的新记录集对象。这并没有让我感到有希望。如果这是准确的。关于在不创建新记录集的情况下保留信息的想法?谢谢。我最后做的只是执行sql查询来添加它们,这样我就可以避免在运行时弄乱它,效果很好。仍然不确定为什么SQL可以做到这一点,但内置的功能无法做到。这是内置的功能吗?或者是需要添加的东西?这些对象和方法是ADOX库的一部分,但您需要将它们集成到代码中。正如你从我给你的例子中所看到的,这非常简单。来扩展埃蒂安的答案。“ADO Ext.6.0 for DDL…”中的DDL代表并是一个面向对象的RDBMS不可知库。我很欣赏它,但这将是整个系统的一个巨大负担。所以我喜欢这个建议在我的情况下是不可行的
with rs
     .fields.append "column name", "enum dataType"
 end withrs.Open "MeterReads", DataEnvironment7.cnPTracker, adOpenStatic, adLockOptimistic, adCmdTable
' 2019-11-4 Adding in a section to accomadate for days to depeletion
If gbEnableD2D Then
    bExists = False
    With rs
        For Each fField In rs.Fields
            If UCase(fField.Name) = UCase("eddB") Then
                bExists = True
                Exit For
            End If
        Next
        If bExists = False Then
            .Close
            .Fields.Append "eddB", adDate
            .Fields.Append "eddC", adDate
            .Fields.Append "eddM", adDate
            .Fields.Append "eddY", adDate
            .Open
        End If
    End With
End If