1. 程式人生 > >python連結資料庫SQL Server 2005出錯怎麼辦???附解決方案以及開啟TCP/IP協議和檢視預設埠的過程

python連結資料庫SQL Server 2005出錯怎麼辦???附解決方案以及開啟TCP/IP協議和檢視預設埠的過程

import pymssql
conn=pymssql.connect(host='127.0.0.1:1433',user='sa',password='jxn',database='scott',charset="UTF-8")
'''
如果和本機資料庫互動,只需修改連結字串
conn=pymssql.connect(host='.',database='Michael')
'''
cur=conn.cursor()
cur.execute('select * from emp')
#如果update/delete/insert記得要conn.commit()
#否則資料庫事務無法提交
print(cur.fetchall())
cur.close()
conn.close()

一開始執行上面程式碼老是出現以下錯誤:

Traceback (most recent call last):
  File "src\pymssql.pyx", line 636, in pymssql.connect
  File "src\_mssql.pyx", line 1952, in _mssql.connect
  File "src\_mssql.pyx", line 673, in _mssql.MSSQLConnection.__init__
  File "src\_mssql.pyx", line 1680, in _mssql.maybe_raise_MSSQLDatabaseException
_mssql.MSSQLDatabaseException: (20009, b'Unknown error')


During handling of the above exception, another exception occurred:


Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    conn=pymssql.connect(host='127.0.0.1',user='sa',password='jxn',database='scott',charset='utf-8')
  File "src\pymssql.pyx", line 642, in pymssql.connect

pymssql.OperationalError: (20009, b'Unknown error')

查看了網上很多的資料,都找不到答案,添加了埠號:沒用,添加了charset:沒用,TCP/IP開啟:沒用,

有的網友說要不試一下用pyodbc進行資料庫連線?好吧,我不想放棄,就又去安裝pyodbc,並找了段測試程式碼:

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Native Client};SERVER=127.0.0.1,1433;DATABASE=scott;UID=sa;PWD=jxn')
cursor = cnxn.cursor()
cursor.execute("select * from emp")
rows = cursor.fetchall()
for row in rows:
    print(row)

執行結果是如下錯誤:

Traceback (most recent call last):
  File "D:/Python362/a_資料庫/2.py", line 2, in <module>
    cnxn = pyodbc.connect('DRIVER={SQL Native Client};SERVER=127.0.0.1,1433;DATABASE=scott;UID=sa;PWD=jxn')

pyodbc.OperationalError: ('08001', '[08001] [Microsoft][SQL Native Client]TCP 提供程式: 由於目標計算機積極拒絕,無法連線。\r\n (10061) (SQLDriverConnect); [08001] [Microsoft][SQL Native Client]登入超時已過期 (0); [08001] [Microsoft][SQL Native Client]建立到伺服器的連線時發生錯誤。連線到 SQL Server 2005 時,預設設定 SQL Server 不允許遠端連線這個事實可能會導致失敗。 (10061)')

不管什麼辦法就是調不通,萬般無奈之下,看了有的部落格說將防火牆檢查一下,就是以下這篇部落格:點選開啟連結

我抱著試試看的心裡,結果還真成功了!!!吐舌頭大笑微笑

我的詳細設定過程是:

第一步:在開始選單中輸入:Firewall.cpl,然後點選該程式



點選允許程式或功能通過Windows防火牆,你會發現裡面沒有SQL Server,那就需要我們手動新增,將新增路徑指定到你安裝資料庫的資料夾裡,並在資料夾裡找到sqlserver.exe




新增完了之後你就會發現SQL Server也在裡面了


然後點選確定,防火牆這一塊就算結束了。

下面是驗證程式碼:

import pymssql

conn=pymssql.connect(host='127.0.0.1:1433',user='sa',password='jxn',database='scott',charset="UTF-8")
'''
如果和本機資料庫互動,只需修改連結字串
conn=pymssql.connect(host='.',database='Michael')
'''
cur=conn.cursor()

cur.execute('select * from emp')
#如果update/delete/insert記得要conn.commit()
#否則資料庫事務無法提交
print(cur.fetchall())

cur.close()

conn.close()

輸出結果為:

====================== RESTART: D:/Python362/a_資料庫/1.py ======================
[(7369, 'SMITH', 'CLERK', 7902, '1981-12-17', 800, None, 20), (7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20', 1600, 300, 30), (7521, 'WARD', 'SALESMAN', 7698, '1981-2-22', 1250, 500, 30), (7566, 'JONES', 'MANAGER', 7839, '1981-4-2', 2975, None, 20), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28', 1250, 1400, 30), (7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1', 2850, None, 30), (7782, 'CLARK', 'MANAGER', 7839, '1981-6-9', 2450, None, 10), (7788, 'SCOTT', 'ANALYST', 7566, '1981-4-19', 3000, None, 20), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000, None, 10), (7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, 0, 30), (7876, 'ADAMS', 'CLERK', 7788, '1987-5-23', 1100, None, 20), (7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, None, 30), (7902, 'FORD', 'ANALYST', 7566, '1982-12-3', 3000, None, 20), (7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, None, 10)]

另一種資料庫連線方法:

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Native Client};SERVER=127.0.0.1,1433;DATABASE=scott;UID=sa;PWD=jxn')
cursor = cnxn.cursor()
cursor.execute("select * from emp")
rows = cursor.fetchall()
for row in rows:
    print(row)

輸出結果為:

====================== RESTART: D:/Python362/a_資料庫/2.py ======================
(7369, 'SMITH', 'CLERK', 7902, '1981-12-17', 800, None, 20)
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20', 1600, 300, 30)
(7521, 'WARD', 'SALESMAN', 7698, '1981-2-22', 1250, 500, 30)
(7566, 'JONES', 'MANAGER', 7839, '1981-4-2', 2975, None, 20)
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28', 1250, 1400, 30)
(7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1', 2850, None, 30)
(7782, 'CLARK', 'MANAGER', 7839, '1981-6-9', 2450, None, 10)
(7788, 'SCOTT', 'ANALYST', 7566, '1981-4-19', 3000, None, 20)
(7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000, None, 10)
(7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, 0, 30)
(7876, 'ADAMS', 'CLERK', 7788, '1987-5-23', 1100, None, 20)
(7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, None, 30)
(7902, 'FORD', 'ANALYST', 7566, '1982-12-3', 3000, None, 20)
(7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, None, 10)

有什麼疑問可以加我QQ討論一下:1148540694

以下是開啟TCP/IP協議以及檢視預設埠的過程!!!

要想執行成功,前提條件還需要將TCP/IP協議開啟,下面附上開啟過程以及檢視埠的過程







右擊TCP/IP選擇屬性



TCP動態埠我的一開始是0,TCP埠是空,看了網上教程說需要修改,然後我將TCP動態埠改為空,TCP埠改為預設埠1433,預設埠可以通過以下步驟檢視,待會兒講解,最後按確定。

以下步驟是檢視TCP預設埠:SQL Native Client配置->客戶端協議->TCP/IP->屬性