首页 > 解决方案 > 向 SQL 查询传递多个参数时 Python 崩溃

问题描述

在 Windows 7 上使用adodbapi2.6 包时,当向 SQL 查询传递多个参数时,Python 将崩溃(生成“Python 已停止工作”弹出窗口)。我正在尝试将参数传递给 ADO 连接游标以查询 SQL Server Compact 数据库 (.sdf)。

我也尝试过正常的字符串格式,它工作正常,但根据许多 stackoverflow 讨论是一个安全漏洞。

我的代码如下:

import adodbapi as ado

#connection provider
provider = "Microsoft.SQLSERVER.CE.OLEDB.4.0"
#database location path
filePath = "results.sdf"
#max size of database file in MB
maxSize = "4000"

#combine into connection string
connectionString = ("Provider = {}; Data Source = {}; SSCe:Max Database Size = {}"
                         .format(provider, filePath, maxSize))

#create connection
dbConnection = ado.connect(connectionString)

#create cursor
cursor = dbConnection.cursor()

cursor.execute("--THE QUERIES DESCRIBED BELOW--")  #**** location of fault****

print(cursor.fetchall().ado_results)

cursor.close()

传递一个参数可以正常工作,例如:

cursor.execute("SELECT MeasurementId, Decimals FROM Compound WHERE MeasurementId >= ?", (11774,))

并且执行非参数化查询工作正常,例如:

cursor.execute("SELECT MeasurementId, Decimals FROM Compound WHERE (MeasurementId >= 11774 AND MeasurementId <= 11779)")

但是,当使用两个参数尝试完全相同的查询时,它会使 python 崩溃,并且在编辑器中没有生成错误消息,例如:

cursor.execute("SELECT MeasurementId, Decimals FROM Compound WHERE (MeasurementId >= ? AND MeasurementId <= ?)", (11774, 11779))

从命令提示符(在 Windows 7 中)运行文件时,这会生成一个弹出窗口,声称“Python 已停止工作”,其中包含一堆信息,包括:

Problem Event Name      BEX64 
Application Name:       python.exe
Fault Module Name:      MSVCR90.dll
Fault Module Version:   9.0.30729.6161
Exception Code:         c0000417
OS Version:             6.1.7601.2.1.0.256.4

然后进程退出(在 JupyterLabs/VSCode 上尝试时,它会冻结内核)

我尝试将参数作为列表传递,使用不同的参数样式(格式和命名,尽管我认为 adodbapi 将这一切都转换回标准 qmark 格式),更改光标设置和不同的多参数查询,所有这些都具有相同的结果。

这是正确使用参数传递吗?我知道您不应该传递表或列名,但这似乎是一个正确的查询,应该可以正常执行。

标签: pythonsqlparameter-passingadodbapi

解决方案


推荐阅读