MS Access 在传递查询中使用表单

2023-12-06

我有一个名为菲茨·安特·达根,一个名为查询FietsAantDagen和一个名为Txtinput。我正在尝试使用 SQL Server 的直通查询,并使用文本表单的输入作为查询中的输入。

Query:

SELECT
   Fiets_id,
   Fiets_Type,
   SUM(DATEDIFF(DAY, Huurovereenkomst_Begin_datum, Huurovereenkomst_Eind_datum)) AS AantalDagen 
FROM
   Fiets 
   INNER JOIN
      HuurovereenkomstFiets 
      ON HuurovereenkomstFiets_Fiets_id = Fiets_id 
   INNER JOIN
      Huurovereenkomst 
      ON Huurovereenkomst_id = HuurovereenkomstFiets_Huurovereenkomst_id 
WHERE
   YEAR(Huurovereenkomst_Begin_datum) = [Forms]![FietsAantDagen]![Txtinput] 
   AND YEAR(Huurovereenkomst_Eind_datum) = [Forms]![FietsAantDagen]![Txtinput] 
GROUP BY
   Fiets_id,
   Fiets_Type

将此查询作为传递查询运行时,出现以下错误:

ODBC:运行时错误 [Microsoft][SQL Server Native Client 11.0][SQL Server]关键字“WHERE”附近的语法不正确/ (#156)

问题是我在传递查询中使用 Access 文本表单值吗?如果是,我该如何解决?

我在另一个溢出问题中读到您需要添加 (),我这样做了,现在我收到错误:

不支持 JOIN 表达式。

我要疯了...


如果您没有直接使用 SQL Server,那么最好创建两个直通查询。

查询 #1 – 这是您的原始 SQL 例如:

SELECT
    Fiets_id,
    Fiets_Type,
    SUM(DATEDIFF(DAY, Huurovereenkomst_Begin_datum,
    Huurovereenkomst_Eind_datum)) AS AantalDagen 
FROM
   Fiets 
INNER JOIN
  HuurovereenkomstFiets 
  ON HuurovereenkomstFiets_Fiets_id = Fiets_id 
INNER JOIN
  Huurovereenkomst 
  ON Huurovereenkomst_id = HuurovereenkomstFiets_Huurovereenkomst_id 
WHERE
  YEAR(Huurovereenkomst_Begin_datum) = [StartYear]
  AND YEAR(Huurovereenkomst_Eind_datum) = [EndYear]
GROUP BY
  Fiets_id,
   Fiets_Type

查询 #2 – 这是您进行的应用程序范围查询,您可以对任何原始 t-SQL(SQL 服务器传递)反复重复使用。然后你在代码中像这样:

Dim rst     As DAO.Recordset
Dim strSQL  As String

strSQL = CurrentDb.QueryDefs("MyQ1").SQL
srtSQL = Replace(strSQL, "[YearStart]", [Forms]![FietsAantDagen]![Txtinput])
strSQL = Replace(strSQL, "[YearEnd]", [Forms]![FietsAantDagen]![Txtinput])
With CurrentDb.QueryDefs("qryPassR")
   .SQL = strSQL
  .ReturnsRecords = True
  Set rst = .OpenRecordset
End With

但是,如果您有能力使用 SQL Server 并创建过程,那么我建议您创建如下存储过程:

CREATE PROCEDURE SelectDates
@StartYear int,
@EndYear int
AS
BEGIN
SET NOCOUNT ON;
 SELECT
   Fiets_id,
   Fiets_Type,
   SUM(DATEDIFF(DAY, Huurovereenkomst_Begin_datum, Huurovereenkomst_Eind_datum)) AS AantalDagen 
FROM
Fiets 
   INNER JOIN
    HuurovereenkomstFiets 
  ON HuurovereenkomstFiets_Fiets_id = Fiets_id 
INNER JOIN
   Huurovereenkomst 
   ON Huurovereenkomst_id = HuurovereenkomstFiets_Huurovereenkomst_id 
WHERE
YEAR(Huurovereenkomst_Begin_datum) = @StartYear
AND YEAR(Huurovereenkomst_Eind_datum) = @EndYear
GROUP BY
   Fiets_id,
   Fiets_Type

END

然后在访问中,您可以使用:

Dim rst     As DAO.Recordset

With CurrentDb.QueryDefs("qryPassR")
   .SQL = "exec SelectDates " & [Forms]![FietsAantDagen]![Txtinput] & "," & _
          [Forms]![FietsAantDagen]![Txtinput]
  .ReturnsRecords = True
  Set rst = .OpenRecordset
End With

因此,通过传递参数可以减少与 SQL 注入相关的大部分问题。 当然,如果你无法创建商店过程,或者没有权限,那么你必须采用上面的第一个想法。当然,您也可以在第一个建议中将原始 SQL 插入代码编辑器中,但我发现使用了一个额外的查询来“仅”保存原始 SQL,然后将 SQL 修改为第二个传递查询就消除了这种需要针对 VBA 代码编辑器中混乱的 SQL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MS Access 在传递查询中使用表单 的相关文章

随机推荐