2016-12-03 14 views
0

私は次のPythonコードを持っています。これはテキストファイルを1行ずつ読み込み、各行の文字xからyを変数 "Contract"として取ります。Python PYODBC - 前のSQLはクエリではありません

import os 
import pyodbc 

cnxn = pyodbc.connect(r'DRIVER={SQL Server};CENSORED;Trusted_Connection=yes;') 
cursor = cnxn.cursor() 


claimsfile = open('claims.txt','r') 

for line in claimsfile: 
    #ldata = claimsfile.readline() 
    contract = line[18:26] 
    print(contract) 
    cursor.execute("USE calms SELECT XREF_PLAN_CODE FROM  calms_schema.APP_QUOTE WHERE APPLICATION_ID = "+str(contract)) 
print(cursor.fetchall()) 

ラインcursor.fetchallを(含む)、次のエラーが返されます。

Programming Error: Previous SQL was not a query.

問合せは、SSMSで実行され、変数の結果の実際の値とSTR(契約)を置き換えます期待どおりに返されます。

データに基づいて、クエリはNVARCHAR(4)としてフォーマットされた結果として1つの値を返します。

ほとんどの他の例にはループの前に宣言された変数があり、提案された解決策はNO COUNTを設定することですが、これは私の問題には当てはまりませんので少し失われます。

P.S.私はまた、それが成功せずに問題を引き起こしていた場合に備えて、ファイルを反復処理するためにループなしで独自のスタンドアロンファイルにクエリを配置しました。

答えて

1

SQLクエリでは、実際にはUSESELECTの2つのコマンドを作成しており、カーソルは複数のステートメントで設定されていません。さらに、データベース接続では、接続文字列(DATABASE引数)でデータベーススキーマを選択する必要があるため、TSQLのUSEは不要です。

APPLICATION_IDが整数型であると仮定して、パラメータ化で次の調整を考慮してください。必要に応じて資格情報を追加します。

constr = 'DRIVER={SQL Server};SERVER=CENSORED;Trusted_Connection=yes;' \ 
     'DATABASE=calms;UID=username;PWD=password' 
cnxn = pyodbc.connect(constr) 
cur = cnxn.cursor() 

with open('claims.txt','r') as f: 
    for line in f: 
     contract = line[18:26] 
     print(contract) 

     # EXECUTE QUERY 
     cur.execute("SELECT XREF_PLAN_CODE FROM APP_QUOTE WHERE APPLICATION_ID = ?", 
        [int(contract)]) 
     # FETCH ROWS ITERATIVELY 
     for row in cur.fetchall(): 
      print(row) 

cur.close() 
cnxn.close() 
+0

あなたは、 –

+0

グレート:)おかげで絶対に正しいです!これが助けられた場合は、解答を受け入れるようにしてください。 – Parfait