2013-12-09 15 views
2

我使用DAO數據組件來綁定表單上的控件元素。我在綁定到Data組件的記錄集中動態創建的查詢。這工作得很好。但是,當我運行Data.Refresh並且SQL Where語句包含通過不同別名對同一表的引用時,則顯示一個錯誤。DAO數據綁定刷新()調用 - 運行時錯誤3061,3075

注:以下運行良好的SQL查詢在MS Access查詢設計器

Global gDB As DataBase 

Set Data1.Recordset = GetData(select, from, where, order) 
Data1.Refresh 

Public Function GetData(select As String, from As String, where As String, order As String) As Recordset 
    Dim sql As String 
    sql = "SELECT " & select & " FROM " & from & " WHERE " & where & " ORDER BY " & order 
    Set GetData = gDB.OpenRecordset(sql, dbOpenDynaset) 
End Function 

下面的工作:

SELECT 
    WIZ_APPL.*, 
    TRANS_PRI.Text AS LocalizedText 
FROM 
    TRANSLATIONS AS TRANS_PRI, 
    WIZ 
WHERE 
    TRANS_PRI.Tag="prog" & WIZ_APPL.Id AND 
    TRANS_PRI.LanguageId=1 AND 
    WIZ_APPL.Enabled <> 0 
ORDER BY 
    WIZ_APPL.Id; 

直到我試試這個:

SELECT 
    WIZ_APPL.*, 
    TRANS_PRI.Text AS LocalizedText, 
    TRANS_ALT.Text As AlternativeText 
FROM 
    TRANSLATIONS AS TRANS_PRI, 
    TRANSLATIONS AS TRANS_ALT, 
    WIZ_APPL 
WHERE 
    TRANS_PRI.tag="prog" & WIZ_APPL.Id AND 
    TRANS_ALT.tag="prog" & WIZ_APPL.Id AND 
    TRANS_PRI.LanguageId=1 AND 
    TRANS_ALT.LanguageId=2 AND 
    WIZ_APPL.Enabled <> 0 
ORDER BY 
    WIZ_APPL.Id; 

我得到運行時錯誤'3061': T很少有參數。預期1.

由於查詢略有不同,其中包括另一個表上的INNER JOIN,所以我得到運行時錯誤'3075': 查詢表達式'TRANS_PRI.tag ='prog'中的語法錯誤(缺少運算符) 。

SELECT 
    WIZ_APPL.*, 
    TRANS_PRI.Text AS LocalizedText, 
    TRANS_ALT.Text As AlternativeText 
FROM 
    TRANSLATIONS AS TRANS_PRI, 
    TRANSLATIONS AS TRANS_ALT, 
    WIZ_APPL 
INNER JOIN 
    WIZ_COUNTRY_APPL ON WIZ_APPL.Id = WIZ_COUNTRY_APPL.APPL 
WHERE 
    TRANS_PRI.tag="prog" & WIZ_APPL.Id AND 
    TRANS_ALT.tag="prog" & WIZ_APPL.Id AND 
    TRANS_PRI.LanguageId=1 AND 
    TRANS_ALT.LanguageId=2 AND 
    WIZ_COUNTRY_APPL.Country=1 
ORDER BY 
    WIZ_APPL.Id; 

的bizar的事情是創造記錄是好的,我可以,只要我打電話Data1.Refresh我得到的打印數據。此外,窗體上的控件綁定和顯示數據。但是, ()可能會破壞記錄集(這可能是正常行爲)

Set Data1.Recordset = GetData(select, from, where, order) 
Do While Not Data1.Recordset.EOF 
    Debug.Print Data1.Recordset!LocalizedText 
    Debug.Print Data1.Recordset!AlternativeText 
    Data1.Recordset.MoveNext 
Loop 
Data1.Refresh 

更新:如果我將SQL查詢作爲字符串分配給Data1.RecordSource,則刷新工作正常。但是,當我將SQL查詢分配給記錄集時,recordset.Name僅包含SQL查詢的一部分。在Refresh()調用Data1.RecordSource與Data1.RecordSet.Name相同之後。如果Data組件嘗試從縮短的Recordset名稱構建查詢,那麼它顯然不起作用。

這是一個已知的VB6 DAO Recordset問題嗎?

+0

如果將雙引號更改爲單引號,會發生什麼情況? (圍繞「prog」的兩個實例) –

+0

它沒有區別。我擔心這是一個DAO記錄集錯誤。我將添加它作爲答案。 –

+0

有趣。感謝更新。 –

回答

1

我不完全確定這一點,但我認爲這是一個DAO記錄集和數據組件錯誤。

它看起來像記錄集使用SQL查詢來創建其名稱屬性,但是,它將查詢縮短。數據組件似乎使用此剪切查詢刷新其內部記錄集。

錯誤1:記錄集名稱屬性削減查詢短小 錯誤2:數據組件可能使用記錄集名稱屬性從記錄集中檢索SQL查詢,或者使用另一個屬性/函數也會將查詢縮短

解決方法或者正確的使用方法;不要將SQL查詢分配給內部記錄集,而是使用數據組件記錄源屬性