2017-04-19 45 views
3

我使用Python 3.6,pyodbc和連接到SQL Server。pyodbc sql包含0個參數標記,但提供了1個參數''hy000'

我想連接到數據庫,然後用參數創建一個查詢。

下面是代碼:

import sys 
import pyodbc 

# connection parameters 
nHost = 'host' 
nBase = 'base' 
nUser = 'user' 
nPasw = 'pass' 

# make connection start 
def sqlconnect(nHost,nBase,nUser,nPasw): 
    try: 
     return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw) 
     print("connection successfull") 
    except: 
     print ("connection failed check authorization parameters") 
con = sqlconnect(nHost,nBase,nUser,nPasw) 
cursor = con.cursor() 
# make connection stop 

# if run WITHOUT parameters THEN everything is OK 
ask = input ('Go WITHOUT parameters y/n ?') 
if ask == 'y': 
    # SQL without parameters start 
    res = cursor.execute(''' 
    SELECT * FROM TABLE 
    WHERE TABLE.TIMESTAMP BETWEEN '2017-03-01T00:00:00.000' AND '2017-03-01T01:00:00.000' 
    ''') 
    # SQL without parameters stop 

    # print result to console start 
    row = res.fetchone() 
    while row: 
     print (row) 
     row = res.fetchone() 
    # print result to console stop 

# if run WITH parameters THEN ERROR 
ask = input ('Go WITH parameters y/n ?') 
if ask == 'y': 

    # parameters start 
    STARTDATE = "'2017-03-01T00:00:00.000'" 
    ENDDATE = "'2017-03-01T01:00:00.000'" 
    # parameters end 

    # SQL with parameters start 
    res = cursor.execute(''' 
    SELECT * FROM TABLE 
    WHERE TABLE.TIMESTAMP BETWEEN :STARTDATE AND :ENDDATE 
    ''', {"STARTDATE": STARTDATE, "ENDDATE": ENDDATE}) 
    # SQL with parameters stop 

    # print result to console start 
    row = res.fetchone() 
    while row: 
     print (row) 
     row = res.fetchone() 
    # print result to console stop 

當我運行沒有SQL參數的程序,它的工作原理。

當我嘗試使用參數運行它時,發生錯誤。

+1

不知道pyodbc支持命名參數。至少沒有更早 –

+0

謝謝,你知道另一個支持? – Aleks

+0

[pyodbc是否支持任何形式的命名參數?](http://stackoverflow.com/questions/32748982/does-pyodbc-support-any-form-of-named-parameters) – m13r

回答

9

通過ODBC的SQL語句中的參數是位置的,並且標記爲?。因此:

# SQL with parameters start 
res = cursor.execute(''' 
SELECT * FROM TABLE 
WHERE TABLE.TIMESTAMP BETWEEN ? AND ? 
''', STARTDATE, ENDDATE) 
# SQL with parameters stop 

另外,最好避免將日期作爲字符串傳遞。讓pyodbc照顧使用Python的日期時間:

from datetime import datetime 
... 
STARTDATE = datetime(year=2017, month=3, day=1) 
ENDDATE = datetime(year=2017, month=3, day=1, hour=0, minute=0, second=1) 

然後只是傳遞參數如上。如果您更喜歡字符串解析,請參閱this answer

+0

謝謝!我認爲這是正確的方式,但我有下一個錯誤:pyodbc .DataError:<'22007','[22007]' – Aleks

+0

這是一個無效的日期時間格式錯誤(請參閱https://docs.microsoft.com/en-us/ SQL/ODBC /參考/附錄/附錄-A-ODBC的錯誤碼)。我認爲這可能會發生。你應該嘗試使用這樣的日期時間: 'from datetime import datetime ... STARTDATE = datetime(year = 2017,month = 1,...) ' – themiurge

+0

我編輯了我的答案。 – themiurge

0

我tryied,有很多不同的錯誤:42000,22007,07002等

工作版本是波紋管:

import sys 
import pyodbc 
import datetime 

# connection parameters 
nHost = 'host' 
nBase = 'DBname' 
nUser = 'user' 
nPasw = 'pass' 

# make connection start 
def sqlconnect(nHost,nBase,nUser,nPasw): 
    try: 
     return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw) 
    except: 
     print ("connection failed check authorization parameters") 
con = sqlconnect(nHost,nBase,nUser,nPasw) 
cursor = con.cursor() 
# make connection stop 

STARTDATE = '11/2/2017' 
ENDDATE = '12/2/2017' 
params = (STARTDATE, ENDDATE) 

# SQL with parameters start 
sql = (''' 
SELECT * FROM TABLE 
WHERE TABLE.TIMESTAMP BETWEEN CAST(? as datetime) AND CAST(? as datetime) 
''') 
# SQL with parameters stop 

# print result to console start 
query = cursor.execute(sql, params) 
row = query.fetchone() 
while row: 
    print (row) 
    row = query.fetchone() 
# print result to console stop 
say = input ('everething is ok, you can close console') 
相關問題