【问题标题】:Append columns to an ADO Recordset将列附加到 ADO 记录集
【发布时间】:2019-11-04 23:50:08
【问题描述】:

我正在尝试将列添加到 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 的调试系统。它基本上有一个部分显示你的变量和对象,它显示里面的项目和更多信息。所以我知道它会尝试它。但我似乎无法让它保留它。任何关于我搞砸的想法或想法都会很棒。

【问题讨论】:

  • 我确实发现了对打开的 Recordset 或设置了 ActiveConnection 属性的 Recordset 调用 fields.Append 方法会导致运行时错误。您只能将字段附加到未打开且尚未连接到数据源的 Recordset。通常,这些是您使用 CreateRecordset 方法或通过将新 Recordset 对象显式分配给对象变量来创建的新 Recordset 对象。这并不让我感到充满希望。如果这是准确的。在不创建新记录集的情况下保留信息的想法?

标签: vb6 ado


【解决方案1】:

如果要修改数据库中表的结构,可以使用Microsoft ADO Ext. 6.0 用于 DDL 和安全 库(从项目菜单 > 参考将其添加到您的项目中)。您可以通过遍历 Catalog 对象的 Tables 集合找到要修改的表。首先创建一个 Catalog 对象:

Dim objCatalog As ADOX.Catalog

' Create and Open Catalog
Set objCatalog = New ADOX.Catalog
Set objCatalog.ActiveConnection = DataEnvironment7.cnPTracker

我假设 DataEnvironment7.cnPTracker 是您当前的 ADO 连接对象。

然后遍历Tables:

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

【讨论】:

  • 这是内置在功能中的吗?还是需要添加一些东西?
  • 这些对象和方法是 ADOX 库的一部分,但您需要将它们集成到您的代码中。正如您从我给您的示例中看到的那样,它非常简单。
  • 扩展 Étienne 的回答。 "ADO Ext. 6.0 for DDL..." 中的 DDL 代表 Data Definition Language,是一个面向对象、与 RDBMS 无关的库。
  • 我很感激,但这将是对整个系统的大规模改造。所以我喜欢这个建议在我的情况下是不可行的
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我最终所做的只是执行 sql 查询来添加它们,这样我就可以避免弄乱它,它工作得很好。仍然不确定为什么 SQL 可以做到,但内置功能却不能。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多