0

私は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)
>>> 
4

2 に答える 2

2

%フォーマット演算子は使用しないでください。これは安全ではありません。

これがPythonデータベースAPI仕様v2.0です http://www.python.org/dev/peps/pep-0249/

ほとんどのPythonDBラッパーはそれをサポートしています。

于 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 の「標準」です。adodbapiと呼ばれる ACCESS で使用できるものがあります。このライブラリの状態についてはわかりません。上記で行っている補間に近づかないと人々が言う理由は、無効な SQL を作成する可能性があり、信頼できないソースからデータを取得している場合、セキュリティ上のリスクがあるためです。

使用することのもう 1 つの大きな利点dbapiは、それが標準であることです。そして、あなたのコードは、ちょっと試してみれば、他のデータベースにかなり移植できるでしょう。

ライブラリをダウンロードせずに今すぐ DBAPI を試してみませんか? py2.5 以降を使用している場合は、sqlite が組み込まれています。ここで sqlite3 モジュールをチェックしてください。

于 2012-05-08T16:01:22.890 に答える