2013-08-06 1 views
0

루프에 문제가 있습니다.루프에 오류가 있습니다. ('SQL에는 매개 변수 마커가 1 개 있지만 매개 변수 4 개가 제공되었습니다.', 'HY000')

for i in theList: 

    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN=?', i) 
    known_hours=process_query('SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?',(i)) 

theList는 다음과 같이 정의된다 : 다음과 같이 내가 루프가

theList=process_query('SELECT DISTINCT SSN FROM Employee', None) 

이 이제 오류없이 작동, 마지막으로 감사 beargle합니다. 그러나 나는 내가 해결할 수없는 또 다른 문제를 발견, 즉 그 나는 아래 process_query 함수를 호출 할 때 :

def process_query(query, parameters):  
    if(parameters is None):  
     cursor1.execute(query) 
    else: 
     cursor1.execute(query, parameters) (*LINE 33) 

    n=0 
    lista = [] 

    while 1: 
     row = cursor1.fetchone()  
     if not row: 
      break 
     lista.append(row[0]) 
     n = n+1 
    return lista  

말썽 이제 프로그램이 두 번째 cursor1.execute에 불만이다 (A 별표 표시, *) 그 '(SQL은 1 개의 매개 변수 마커를 포함하고 있지만 4 개의 매개 변수가 제공되었습니다', 'HY000') 나는 그것이 i에서 유래했다고 생각합니다. 이는 사회 보장 번호이며 따라서 한 자리 숫자가 아니지만 이것을 해결하는 방법을 이해할 수는 없습니다 발행물.

편집 : 여기에 전체 인쇄와 전체 루프 온다! 다음 인쇄 (참고를 제공

루프 (일부 정의)

theList=process_query('SELECT DISTINCT SSN FROM Employee', None)  
temp=[] 

for i in theList: 
    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', (i)) (LINE 71)  
    known_hours=process_query('SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?',(i))  
    temp.append(known_hours)  
    unknown_hours=process_query('SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?', (i))  
    unknown_hours=map(int,unknown_hours)  
    temp.append(unknown_hours)  
    if(unknown_hours > 0):  
     temp.append('Yes')  
    else:  
     temp.append('No')  
    theList.append(temp)   
print theList 

필자도 업데이트 process_query 그것은 출력합니다 있도록 쿼리 (순서대로) 매개 변수를 설정합니다.

SELECT DISTINCT SSN FROM Employee 

None 
SELECT FName, LName FROM Employee WHERE SSN= ? 

123456789 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

123456789 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

123456789 

SELECT FName, LName FROM Employee WHERE SSN= ? 

333445555 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

333445555 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

333445555 

SELECT FName, LName FROM Employee WHERE SSN= ? 

453453453 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

453453453 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

453453453 

SELECT FName, LName FROM Employee WHERE SSN= ? 

666884444 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

666884444 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

666884444 

SELECT FName, LName FROM Employee WHERE SSN= ? 

888665555 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

888665555 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

888665555 

SELECT FName, LName FROM Employee WHERE SSN= ? 

987654321 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

987654321 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

987654321 

SELECT FName, LName FROM Employee WHERE SSN= ? 

987987987 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

987987987 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

987987987 

SELECT FName, LName FROM Employee WHERE SSN= ? 

999887777 

SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=? 

999887777 

SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=? 

999887777 

SELECT FName, LName FROM Employee WHERE SSN= ? 

['John', [Decimal('40.0')], [0], 'Yes'] 

Traceback (most recent call last): 
    File "sumrpt2.py", line 72, in <module> 
    temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', (i)) 
    File "sumrpt2.py", line 35, in process_query 
    cursor1.execute(query, parameters) 
pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 4 parameters were supplied', 'HY000') 

사람은 단서가?

감사합니다, Cenderze

+0

process_query 함수의 (*) 란 무엇입니까? 'print_query' 함수의 첫 줄에'print query, parameters'를 추가하고 질문을 ** full ** 출력으로 업데이트하십시오. – Bryan

+0

@beargle 답장을 보내 주셔서 대단히 감사합니다! 그 지문과 현재 출력물을 추가했습니다. process_query의 애 스터 릭스는 컴파일러가 오류를 불평하는 곳일 뿐이며, 정확하게 편집 한 내용이 더 명확합니다. – Cenderze

+1

'theList'는 SSN 만 포함해야하지만 ' ['John ', [Decimal ('40 .0')], [0], 'Yes']'어떻게 든 추가됩니다. 데이터 소스가 유효한 SSN 만 반환하는지 확인하십시오. – Bryan

답변

0

나는 매개 변수가 목록을 기대하고 숫자를 반복한다고 생각합니다.

시도 :

temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', [i]) 

이 목록을 전달합니다.

+0

답변 해 주셔서 감사합니다! 이렇게하면 이전 오류가 해결되지만 대신 'Python 유형 목록이 지원되지 않습니다. param = 1 ','HY097 ' 나는 googeling로부터 꽤 이해할 수 없다. 이전에이 오류를 처리했거나 처리하는 방법을 알고 있습니까? – Cenderze

+0

@GustavDanell이 경우'(i) '를 사용하여 시도합니다. – Jim

+0

답장을 보내 주셔서 감사합니다! 이것은 이전 오류를 제거하지만 원래의 오류를 제공합니다. ('SQL에 1 개의 매개 변수 마커가 있지만 4 개의 매개 변수가 제공되었습니다', 'HY000') 이상하게 생각합니다. 그럼 그게 뭔지 알 겠어? – Cenderze

0

beargle의 의견에 감사 드리며 결국 문제가 무엇인지 파악할 수있었습니다.

이 후 여러 가지 방식의 주석에서

이 주어졌다 :

나는 당신이 문제가 있다면 자신이 그래서 내가이 오류가 arised 이유에 대한 간략한 요약을 할 수 있다고 생각이 답변을 Google에 다소 어려운 알고 내가해야한다고 생각하는 기능을 호출합니다.

그러나 나는 theList에서 'i'를 반복 했으므로 루프에 실제로 추가되었습니다. ''SQL에 1 개의 매개 변수 마커가 있지만 4 개의 매개 변수가 제공되었습니다. ','HY000 ' "오류가 발생했습니다.

내 쿼리에서 나는 단지 하나의 SSN을 원한다고하지만, 필자는 theList에 추가 된 이후로 다른 열보다 더 많은 마커를 필요로한다는 것을 알 수 있습니다. (따라서 하나의 매개 변수 마커 만 필요한 곳에 4 개의 매개 변수가 제공됩니다. 필수).

호프가 도움이 되었기를 바랍니다.

다시 한번 beargle과 나를 도울 시간이 걸린 다른 모든 사람들에게 감사드립니다!

감사합니다.