问题描述
|
我不是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