2012-05-08 8 views
0

私はPythonの初心者です。私はアクセスデータベースのクエリを実行しています。私はSQL文に文字列変数を渡すことでしたが、倍精度のためにそれを把握することはできません。ここで 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) 
>>> 
+1

PythonのDBAPI仕様と実際に互換性のあるデータベースAPIを使用するようにしてください。 – ThiefMaster

答えて

3

試してみてください。

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が整数である場合は、「データを取得するよりも、上記の「条件式の型不一致」を参照してください。他の人が言及したように、あなたがDBAPIラッパーを使用する必要があり、また

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

はこれを試してみてください。あれは何でしょう? DB-APIは、データベースにアクセスするためのPythonの「標準」です。 ACCESSにはadodbapiと呼ばれるものがあります。私はこのライブラリの状態について全く知らない。なぜなら、無効なSQLを構築する可能性があり、信頼できないソースからデータを取得しているとセキュリティリスクがあるからです。

もう1つBIGdbapiの利点は、それが標準だということです。そしてあなたのコードは、あなたがそれを旋風にするならば、他のデータベースに移植可能であるでしょう。

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

2

%フォーマット演算子を使用しないでください。これは危険です。ここで

は、PythonデータベースAPI仕様v2.0の http://www.python.org/dev/peps/pep-0249/

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

+0

これは普通です。しかし、あなたが@コードを見れば、それはMicrosoft ADOのように見えます。私は間違っている可能性があります、私は長い間それをだましていません。その場合、私はAPIがSQL文を準備する手段を提供していると思います。 – jaime

関連する問題