为什么字符串连接使用Access和PYODBC创建额外的参数?

问题描述 投票:-1回答:2

Example Query

我创建了使用cursor.execute方法调用的此过程。我遇到的问题是PYODBC看到的参数比我给的要多。在此示例查询中,PYODBC将“ -”和“-”作为附加参数读取。有谁知道为什么会这样吗?每当我在Access中进行任何字符串连接时,都会发生这种情况。

def GetAccessResults(self):

    with pyodbc.connect(SQL.DBPath) as con:
        cursor = con.cursor()

        if self.parameters == None:
            cursor.execute('{{Call {}}}'.format(self.storedProc))
        else:
            callString = self.__CreateStoredProcString()
            cursor.execute(callString, self.parameters)

        returnValue = cursor.fetchall()

    return returnValue

def __CreateStoredProcString(self):

    questionMarks = ('?,' * len(self.parameters))[:-1]

    return '{{Call {} ({})}}'.format(self.storedProc, questionMarks)
python ms-access pyodbc
2个回答
0
投票

尝试使用与号:

Select "*-" & Service_Abbreviation & "-*"

此外,Like需要用引号引起来的字符串,并且子查询不会返回该字符串。所以也许:

Select "'*-" & Service_Abbreviation & "-*'"

0
投票

正如OP所发现的,MS Access既是前端GUI应用程序又是后端数据库,在运行SQL时的运行方式有所不同。通常,后端模式倾向于更接近标准SQL,即:

  • Quotes:在后端,单引号保留给文字,双引号保留给标识符,而不是在MSAccess.exe中可以互换。
  • 通配符:在后端,默认情况下,LIKE的通配符使用%,而GUI使用*,除非在使用标准SQL Server compatible syntax (ANSI 92)%中运行Access数据库。因此,请考虑将Access'ALIKE(类似于ANSI)与%在两种Access模式下都兼容。
  • Parameter:在后端,在查询中无法识别的任何未引用对象均被视为已命名参数,并且会出错。同时,GUI启动一个弹出的[[Enter Parameter框(初学者不知道实际上是运行时错误),然后可以对输入的答案进行即时评估。
  • GUI对象:在GUI中,Access查询可以引用打开的窗体和报表中的控件,即使是在独立VBA模块中定义的用户定义的函数,这些相同的引用也会在后端产生错误,该后端实际上在 headless
  • 模式,并且只能识别其他表和查询。
  • Optimization:请参见Allen Browne在GUI与后端中创建查询(尤其是引用Access对象库函数)时可能发生的优化差异。

顺便说一句,在子查询上使用LIKE会将一个标量评估为另一个标量。实际上,如果子查询返回的行多于当前设置可能发生的情况,Access将会出错。

错误3354:此子查询最多可以返回一条记录

[在其他数据库中,评估在子查询的第一行(没有ORDER BY的可以是随机行)上运行,而不是在子查询的所有记录上运行。相反,请考虑将SQL重构为我们的EXISTS子句:

PARAMETERS prmServiceName Tex(255); SELECT c.* FROM Charts c WHERE EXISTS (SELECT 1 FROM Services s WHERE s.ServiceName = prmService_Name AND c.FileName LIKE '*-' & s.Service_Abbreviation & '-*');

© www.soinside.com 2019 - 2024. All rights reserved.