0

我是python的初学者。我正在查询访问数据库。我打算将一个字符串变量传递给 sql 语句,但无法计算出双精度。

这是我的代码:

qllname = 29221.0

llname = "01-01-05-W2"

sqlstatement = recordset.Open("SELECT * FROM LLD WHERE LLD = '%s'" % (llname),connection,1,3)

for x in range(recordset.Fields.Count):

    fields_dict[x] = recordset.Fields.Item(x).Name

    print fields_dict[x], recordset.Fields.Item(x).Value, x


sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)

for x2 in range(recordset2.Fields.Count):

    print recordset2.Fields.Item(x2).Value, type(recordset2.Fields.Item(x2).Value)

结果:

LLD 01-01-05-W2 0
X 678817.81875 1
Y 5431052.45982 2
Traceback (most recent call last):
  File "L:/temporary/start of test/accessnew--.py", line 25, in <module>
    sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)
  File "<COMObject ADODB.Recordset>", line 4, in Open
com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET Database Engine', u'Data type mismatch in criteria expression.', None, 5003071, -2147217913), None)
>>> 
4

2 回答 2

2

您不应该使用%格式化运算符。这是不安全的。

这是 Python 数据库 API 规范 v2.0 http://www.python.org/dev/peps/pep-0249/

大多数 python DB 包装器都支持它。

于 2012-05-08T16:56:48.337 回答
2

尝试:

sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)

您正在使用%d字符串插值运算符,它告诉我您正在将一个数字传递给 SQL 语句。但是,当我认为您需要一个整数时,您会使用 SQL 字符串。我想你想要一个看起来像的 SQL 语句 -

SELECT * FROM SWAWELLS WHERE WWDR_NO = 29221

但是,您提供的代码将生成此语句:

SELECT * FROM SWAWELLS WHERE WWDR_NO = '29221'

如果WWDR_NO是一个整数,那么您将得到上面收到的“标准表达式中的数据类型不匹配”。

尝试这个:

# Notice there is no ' around %d
sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS "
                                "WHERE WWDR_NO = %d" % 
                                (qllname),connection2,1,3)

此外,正如其他人所提到的,您应该使用 DBAPI 包装器。那是什么?DB-API 是用于访问数据库的 python“标准”。有一个可用于 ACCESS 的称为adodbapi。我不知道这个图书馆的状态。人们说远离你上面所做的插值的原因是因为它可以构建无效的 SQL,并且如果你从不受信任的来源获取数据,则会存在安全风险。

使用的另一个好处dbapi是它是一个标准。如果您试一试,您的代码将可以合理地移植到其他数据库。

想要在不下载库的情况下立即查看 DBAPI?如果您使用的是 py2.5 或更高版本,您可以使用 sqlite 内置它。在这里查看 sqlite3 模块。

于 2012-05-08T16:01:22.890 回答