我是python的初学者。我正在对访问数据库进行查询。我是将一个字符串变量传递给sql语句,但无法弄清楚是否为double。
这是我的代码:
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)
>>>
答案 0 :(得分:3)
尝试:
sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3)
您正在使用%d
字符串插值运算符,它告诉我您正在将数字传递给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“标准”。有一个名为adodbapi的ACCESS可用。我不知道这个库的状态。人们说远离上面所做插值的原因是因为它可以构建无效的SQL,如果你从不受信任的来源获取数据,则存在安全风险。
使用dbapi
的其他 BIG 好处是它是一个标准。如果你给它一个旋转,你的代码将合理地移植到其他数据库。
想立即查看DBAPI而无需下载库吗?如果你使用py2.5或更高版本,你可以使用sqlite内置它。查看sqlite3模块here。
答案 1 :(得分:2)
您不应使用%
格式化运算符。这是不安全的。
这是Python数据库API规范v2.0 http://www.python.org/dev/peps/pep-0249/
大多数python DB包装器都支持它。