当一个以上的参数传递给一个SQL查询时,Python崩溃

2024-06-28 10:51:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在windows7上使用adodbapi2.6包时,当多个参数被传递到SQL查询时,Python将崩溃(生成一个“Python has stopped working”弹出窗口)。我正在尝试向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上尝试时,它会冻结内核)

我尝试过以列表的形式传递参数,使用不同的paramastyle(format&name,尽管我认为adodbapi会将其全部转换回标准qmark格式),更改光标设置,以及不同的多参数查询,所有这些都具有相同的结果。你知道吗

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


Tags: namefromexecutesql参数connectionwhereprovider