【问题标题】:multi-part identifier can't be bound error when adding "Order By" clause in Access 2010在 Access 2010 中添加“Order By”子句时无法绑定多部分标识符
【发布时间】:2016-05-05 06:07:38
【问题描述】:

我正在从 Access 2010 ADP 到 SQL Server 2008 中构建一个包含 2 个子表单的表单。我的字段和所有内容都按照我的意愿显示,并且可以连接到控件中。但是,当我尝试对记录源进行排序时,出现“无法绑定多部分标识符”错误。如果我在访问中的查询生成器中运行 SQL,它会很好地返回记录。只是在表单加载时才会引发错误。如果我从 SQL 中删除 Order By,表单会正常加载。

子表单的记录来源:

SELECT      tblTaskTracker.EmployeeID, tblTaskTracker.ProjectID, tblTaskTracker.ReleaseID, tblTaskTracker.TaskStatusID, tblTaskTracker.TaskPriorityID, 
                        tblTaskTracker.DueDate, tblTaskTracker.Notes, tblTaskTracker.CompDate, tblTaskTracker.QCByID, tblTaskTracker.QCDate, tblProject.ProjectName, 
                        tblTaskCode.TaskCodeAbbr
FROM          tblTaskTracker INNER JOIN
                        tblProject ON tblTaskTracker.ProjectID = tblProject.ProjectID INNER JOIN
                        tblTaskCode ON tblTaskTracker.TaskCodeID = tblTaskCode.TaskCodeID INNER JOIN
                        tblTaskStatus ON tblTaskTracker.TaskStatusID = tblTaskStatus.TaskStatusID
WHERE      (tblTaskStatus.TaskStatusType = 'A')

如果我添加

ORDER BY tblTaskTracker.TaskPriorityID

最后,我可以单击“运行”并获得预期的结果。但是,当我关闭查询生成器并尝试加载表单时,我得到了无法绑定的多部分标识符“tblTask​​Tracker.TaskPriorityID”。我在该消息上单击“确定”,该子表单未加载。

【问题讨论】:

    标签: sql-server ms-access-2010


    【解决方案1】:

    我建议您熟悉编写自己的查询而不是查询构建器。然后你就可以开始使用别名了,你的查询会更容易维护。

    SELECT tt.EmployeeID
        , tt.ProjectID
        , tt.ReleaseID
        , tt.TaskStatusID
        , tt.TaskPriorityID
        , tt.DueDate
        , tt.Notes
        , tt.CompDate
        , tt.QCByID
        , tt.QCDate
        , p.ProjectName
        , tc.TaskCodeAbbr
    FROM tblTaskTracker tt
    INNER JOIN tblProject p ON tt.ProjectID = p.ProjectID 
    INNER JOIN tblTaskCode tc ON tt.TaskCodeID = tc.TaskCodeID 
    INNER JOIN tblTaskStatus ts ON tt.TaskStatusID = ts.TaskStatusID
    WHERE ts.TaskStatusType = 'A'
    ORDER BY tt.TaskPriorityID
    

    对于手头的问题,请查看您的表格并确保 order by 中的列拼写正确并且该列存在于该表格中。

    【讨论】:

    • 我知道他不是错字问题,它存在于表格中。这就是我使用查询生成器的部分原因。在 TaskPriorityID 的行中,我只需单击排序类型为升序,然后将排序顺序设置为 1。生成的结果是“ORDER BY tblTask​​Tracker.TaskPriorityID”。我已经用一把细齿梳子完成了它,甚至眯着眼睛看着显示器。没有错别字。
    • 好吧,除非您可以发布一些表定义,否则我们能做的最好的就是猜测。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
    【解决方案2】:
    CREATE TABLE tblTaskTracker(
       TaskID         INT  NOT NULL PRIMARY KEY IDENTITY(1,1)
      ,EmployeeID     INT  NOT NULL
      ,ProjectID      INT  NOT NULL
      ,ReleaseID      INT  NOT NULL
      ,TaskCodeID     INT  NOT NULL
      ,TaskStatusID   INT  NOT NULL
      ,TaskPriorityID INT  NOT NULL
      ,DueDate        DATETIME  NOT NULL
      ,Notes          NVARCHAR()
      ,CompDate       DATETIME 
      ,QCByID         INT 
      ,QCDate         DATETIME 
    );
    INSERT INTO tblTaskTracker(TaskID,EmployeeID,ProjectID,ReleaseID,TaskCodeID,TaskStatusID,TaskPriorityID,DueDate,Notes,CompDate,QCByID,QCDate) VALUES
     (1,206,14331,1,1,1,3,'2016-05-04 00:00:00.000',NULL,NULL,NULL,NULL)
    ,(2,206,14331,1,2,2,3,'2016-05-04 00:00:00.000',NULL,NULL,NULL,NULL);
    

    让我对正在发生的事情摸不着头脑的是,无论我在 SSMS 还是在 Access 中使用 ORDER BY 子句运行原始 SQL,结果都会返回预期的数据。只有在表单加载时才会出现错误。值得一提的是,主窗体没有 OnLoad 事件。两个子窗体都有以下 VBA 来设置子窗体 Datasheet 的列宽。

    Private Sub Form_Load()
        Me.txtProjectID.ColumnWidth = 1440 * 0.75
        Me.txtProjectName.ColumnWidth = 1440 * 2
        Me.txtReleaseNum.ColumnWidth = 1440 * 0.75
        Me.txtTaskCode.ColumnWidth = 1440 * 0.75
        Me.cboStatus.ColumnWidth = 1440 * 1
        Me.cboPriority.ColumnWidth = 1440 * 1
        Me.txtDueDate.ColumnWidth = 1440 * 1
        Me.txtNotes.ColumnWidth = 1440 * 2
        Me.txtCompDate.ColumnWidth = 1440 * 1
        Me.cboQCEmp.ColumnWidth = 1440 * 1.5
        Me.txtQCDate.ColumnWidth = 1440 * 1
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2012-08-17
      • 2013-01-17
      • 2011-11-10
      相关资源
      最近更新 更多