Windows 7でActivePython 2.7.2.5を使用しています。
以下のコードを使用してpyodbcモジュールでsql-serverデータベースに接続しようとすると、後続のトレースバックが表示されます。私が間違っていることについてのアイデアはありますか?
コード:
import pyodbc
driver = 'SQL Server'
server = '**server-name**'
db1 = 'CorpApps'
tcon = 'yes'
uname = 'jnichol3'
pword = '**my-password**'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes')
cursor = cnxn.cursor()
cursor.execute("select * from appaudit_q32013")
rows = cursor.fetchall()
for row in rows:
print row
トレースバック:
Traceback (most recent call last):
File "pyodbc_test.py", line 9, in <module>
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes')
pyodbc.Error: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')
'DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes'
という接続文字列を使用している、server
というサーバー、db1
というデータベースに接続しようとしている。変数は使用しない以前に設定され、それらは使用されません。
接続文字列パラメーターをキーワード引数として connect
関数に渡すことができるため、次のように使用できます。
cnxn = pyodbc.connect(driver='{SQL Server}', Host=server, database=db1,
trusted_connection=tcon, user=uname, password=pword)
同じエラーメッセージが表示されましたが、私の場合、問題は[SQL Server]ドライバーでTLS 1.0が必要でしたが、サーバーで無効になっています。 SNACの新しいバージョンへの変更、SQL Server Native Client 11.0
問題を修正しました。
だから私の接続文字列は次のようになります:
cnxn = pyodbc.connect(driver='{SQL Server Native Client 11.0}',
Host=server, database=db1, trusted_connection=tcon,
user=uname, password=pword)
別の理由でこのエラーに直面していました。
それは私のサーバーがアドレスとは別に「ポート」を持っていたからです。
接続文字列の「サーバー」パラメーターに次の値を割り当てることで修正できます。
"...;Server=<server_name>,<port#>;..."
「コロン」/「ピリオド」ではなく「カンマ」であることに注意してください
どちらの方法でも、異なるセキュリティリスクが存在します。 SQL Server認証を使用する場合は、ユーザーID /パスワードをコードで公開します。ただし、少なくとも同じ資格情報で処理します。 Windows認証を使用する場合は、すべての可能なユーザーがSQLサーバーで適切な権限でセットアップされていることを確認する必要があります。 SQL認証では、1人のユーザーのみを設定できますが、複数のユーザーがその1つのSQLユーザー権限を賢く使用できます。