【发布时间】:2013-12-09 15:53:44
【问题描述】:
我使用 DAO 数据组件对表单上的控件元素进行数据绑定。我在绑定到数据组件的记录集中动态创建的查询。这工作得很好。但是,当我运行 Data.Refresh 并且 SQL Where 语句包含通过不同别名对同一个表的引用时,会显示错误。
注意:下面的 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”: 参数太少。预计 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;
奇怪的是创建的记录集很好,我可以打印数据。此外,表单上的控件是绑定和显示数据的。但是,一旦我调用 Data1.Refresh,我就会收到运行时错误。此外,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 记录集问题吗?
【问题讨论】:
-
如果将双引号改为单引号会怎样? (围绕“prog”的两个实例)
-
没什么区别。我担心这是一个 DAO 记录集错误。我将其添加为答案。
-
有趣。感谢您的更新。
标签: sql vb6 ms-access-2003