【问题标题】:DAO Data bind Refresh() call - Run-time error 3061, 3075DAO 数据绑定 Refresh() 调用 - 运行时错误 3061、3075
【发布时间】: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


【解决方案1】:

我对此并不完全确定,但我认为这是一个 DAO 记录集和数据组件错误。

看起来记录集使用 SQL 查询来创建它的 name 属性,但是它缩短了查询。数据组件似乎使用此剪切查询来刷新其内部记录集。

错误 1:记录集名称属性缩短了查询 错误 2:数据组件可能使用记录集名称属性从记录集中检索 SQL 查询,或者,它使用另一个属性/函数也缩短了查询

解决方法或正确的使用方法;不要将 SQL 查询分配给内部记录集,而是使用数据组件的记录源属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多