簡而言之:
我很擅長開發資料庫,??但我真的需要從 VBA 運行 SELECT 查詢,因為我最終需要使用命名其中一個表的變數來運行它。
這是我的代碼:
SqlStr = "SELECT tblFall2021.fldUserID, tblFall2021.fldDate, tblFall2021.fldTime, tblFall2021.fldUserName, " & _
" tblVolunteers.ID, tblVolunteers.fldPhone, tblVolunteers.fldEmail, tblVolunteers.[fldChurch/Parish], " & _
" tblVolunteers.fldGroup, tblVolunteers.[fldCouncil/Court] " & _
" FROM tblFall2021 INNER JOIN tblVolunteers ON tblFall2021.[fldUserID] = tblVolunteers.[ID] " & _
" WHERE (((tblFall2021.fldDate)='9/22/2021'));"
' MsgBox SqlStr
DoCmd.RunSQL SqlStr
按原樣運行它讓我運行時錯誤“2342”:RunSQL 操作需要一個由 SQL 陳述句組成的引數。
我嘗試將前端和后端的 " 加倍,VBA 根本不喜歡那樣;把它變成紅色,我想是因為它是一個壞字串。
所以我將“”增加了三倍并運行它并得到:
運行時錯誤“3129”:無效的 SQL 陳述句;應為“洗掉”、“插入”、“程序”、“選擇”或“更新”。
上面顯示的字串的形成與 Microsoft 的示例完全匹配。但是我尋求幫助的任何地方都告訴我 DoCmd.RunSQL 只會運行操作查詢,而不是選擇查詢,盡管微軟另有說明:
一個字串運算式,它是操作查詢或資料定義查詢的有效 SQL 陳述句。它使用 INSERT INTO、DELETE、SELECT...INTO、UPDATE、CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE INDEX 或 DROP INDEX 陳述句。如果要訪問另一個資料庫,請包含 IN 子句。
https://docs.microsoft.com/en-us/office/vba/api/access.docmd.runsql
并且我之前在這個站點上被告知 DoCmd.RunSQL 僅用于 SELECT 查詢并且不會執行操作查詢。
(我還嘗試在前后使用 Chr(34) 而不是額外的引號,這也會產生運行時錯誤“3129”。)
上面的字串有問題嗎?我直接從一個查詢的 SQL 視圖中復制了它,該查詢的格式和格式符合 Microsoft 的建議。
所以我完全沒有想法。
提前致謝。
uj5u.com熱心網友回復:
您的 SQL 字串看起來正確,但請參閱此處以確保:如何在 VBA 中除錯動態 SQL
但是:DoCmd.RunSQL實際上僅用于操作查詢。
雖然眾所周知 Microsoft 的檔案有時不正確,但這里不是:SELECT...INTO確實是一個操作查詢,它??創建了一個新表。
SELECT ... FROM ...只回傳資料。你想用結果資料做什么?
- 要使用 VBA 處理它,請使用
DB.OpenRecordset. - 要向用戶顯示資料,您需要一個可以使用
DoCmd.OpenQuery.
uj5u.com熱心網友回復:
考慮用于操作或結果集查詢的存盤的命名查詢。在 MS Access 中,保存的查詢比用代碼(VBA、Python、Java 等)構造的 SQL 陳述句更有效,因為 Access 查詢引擎對保存的查詢運行統計資訊,并將保存最佳執行計劃。
您甚至可以使用QueryDefs動態調整已保存的命名查詢的 SQL,如下所示,這可能是您的預期目標,如下所述
需要使用命名其中一個表的變數運行它
因此,請考慮使用以下 SQL 在 Access 中創建命名查詢物件。請注意使用表別名來減少冗長和日期邏輯的修復,因為 Access 并不直接將日期/時間型別等同于日期字串。
SQL
SELECT t.fldUserID
, t.fldDate
, t.fldTime
, t.fldUserName
, v.ID
, v.fldPhone
, v.fldEmail
, v.[fldChurch/Parish]
, v.fldGroup
, v.[fldCouncil/Court]
FROM tblFall2021 t
INNER JOIN tblVolunteers v
ON t.[fldUserID] = v.[ID]
WHERE t.fldDate = CDate('9/22/2021');
現在,如果您需要換出tblFall2021不同的表,由于使用了表別名,您只需要執行一次,并且可以使用 VBA 執行此操作。
VBA
Dim newTable As String
Dim qDef As QueryDef
newTable = "tblSpring2022"
' RETRIEVE SPECIFIC QUERYDEF
Set qdef = CurrentDb.QueryDefs("mySavedNamedQuery")
' ADJUST SQL PROPERTY
qdef.SQL = Replace(qdef.SQL, "tblFall2021", newTable)
' RELEASE QUERY TO SAVE CHANGES
Set qdef = Nothing
然后,在可以使用查詢物件的任何地方使用調整后的查詢:
' OPEN ADJUSTED QUERY OBJECT
DoCmd.OpenQuery "mySavedNamedQuery"
' ASSIGN OPEN FORM OR REPORT TO ADJUSTED QUERY
Forms!myForm.Form.RecordSource = "mySavedNamedQuery"
Reports!myReport.Report.RecordSource = "mySavedNamedQuery"
' OPEN A RECORDSET OF QUERY, EVEN USE ABOVE QUERYDEF (BEFORE RELEASE)
Set rst = CurrentDb.OpenRecordset("mySavedNamedQuery")
Set rst = qdef.OpenRecordset()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352896.html
上一篇:在python中僅讀取特定行的最有效的檔案型別(非常大的檔案)
下一篇:如何合并具有不同欄位的記錄集
