具有计数字段的可更新记录集-MS Access

问题描述

| 我不是sql专家。也许我要在这里做的甚至是不可能的。 我正在尝试获取一个可更新的记录集,其中包括一个由聚合函数产生的字段。 我正在寻找这样的东西:
SELECT Contact.*,Count(OrderID) as CountOfOrders
FROM Contact INNER JOIN Order ON Order.ContactID = Contact.ContactID
WHERE ContactID = 1
    

解决方法

当使用MSDataShape OLE DE提供程序和Jet(或ACE)的OLE DB提供程序时,确实可以创建一个可更新的ADO记录集,并基于诸如“ 2”之类的集合函数创建“ 1”计算列。生成的类似SQL的代码看起来像这样:
 SHAPE  {SELECT ContactID,ContactName FROM Contact} 
APPEND ({SELECT ContactID,OrderID FROM Orders} 
         RELATE ContactID TO ContactID
       ) As rsDetails,COUNT(rsDetails.OrderID) AS CountOfOrder
这是“概念证明”:将以下内容粘贴到任何VBA模块中(例如使用Excel),无需引用,在您的temp目录中创建一个新的.mdb,创建包含数据的表,以证明记录集可以更新
ContactName
的值,并重新打开记录集以表明它确实已更改:
Sub ShapeAppendCount()

  On Error Resume Next
  Kill Environ$(\"temp\") & \"\\DropMe.mdb\"
  On Error GoTo 0

  Dim cat
  Set cat = CreateObject(\"ADOX.Catalog\")
  With cat
    .Create _
        \"Provider=Microsoft.Jet.OLEDB.4.0;\" & _
        \"Data Source=\" & _
        Environ$(\"temp\") & \"\\DropMe.mdb\"

    Dim jeng
    Set jeng = CreateObject(\"JRO.JetEngine\")
    jeng.RefreshCache .ActiveConnection

    Set .ActiveConnection = Nothing
  End With

  Dim con
  Set con = CreateObject(\"ADODB.Connection\")
  With con
    .ConnectionString = _
        \"Provider=MSDataShape;\" & _
        \"Data Provider=Microsoft.Jet.OLEDB.4.0;\" & _
        \"Data Source=\" & _
        Environ$(\"temp\") & \"\\DropMe.mdb\"
    .CursorLocation = 3
    .Open

    .Execute _
    \"CREATE TABLE Contact (\" & _
    \"ContactID INTEGER NOT NULL UNIQUE,\" & _
    \"ContactName VARCHAR(20) NOT NULL);\"

    .Execute _
    \"CREATE TABLE Orders (\" & _
    \"ContactID INTEGER NOT NULL REFERENCES Contact (ContactID),\" & _
    \"OrderID INTEGER NOT NULL UNIQUE);\"

    .Execute _
    \"INSERT INTO Contact (ContactID,ContactName)\" & _
    \" VALUES (1,\'OneDayWhen\');\"

    .Execute _
    \"INSERT INTO Orders (ContactID,OrderID)\" & _
    \" VALUES (1,1);\"

    .Execute _
    \"INSERT INTO Orders (ContactID,2);\"

    Dim rs
    Set rs = CreateObject(\"ADODB.Recordset\")
    With rs
      .CursorType = 2  \' adOpenDynamic
      .LockType = 4  \' adLockBatchOptimistic

      .Source = _
      \" SHAPE {SELECT ContactID,ContactName FROM Contact} \" & _
      \"APPEND ({SELECT ContactID,OrderID FROM Orders} \" & _
      \"RELATE ContactID TO ContactID) As rsDetails,\" & _
      \" COUNT(rsDetails.OrderID) AS CountOfOrder\"

      Set .ActiveConnection = con
      .Open

      .Fields(\"ContactName\").Value = \"Pink Cat\"

      .UpdateBatch

      MsgBox .GetString
      .Close
    End With

    With rs
      .Source = _
      \"SELECT ContactID,ContactName FROM Contact\"

      Set .ActiveConnection = con
      .Open

      MsgBox .GetString
      .Close

    End With
  End With
End Sub
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...