0

我有一个循环问题。我有一个循环如下:

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    

i现在的问题是程序在第二个 cursor1.execute (标有星号,*)处抱怨('SQL 包含 1 个参数标记,但提供了 4 个参数','HY000'),我认为这是源于一个社会安全号码,因此不是一个数字整数,但我不明白如何解决这个问题。

编辑:这是带有整个打印的整个循环:

循环(和一些定义)

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

4

2 回答 2

0

感谢beargle的评论,我终于可以弄清楚问题所在了!

我知道如果你自己遇到麻烦,用谷歌搜索这些答案有点困难,所以我想我可以简要总结一下为什么会出现这个错误:

在这些帖子的评论中,已经给出了几种不同的方法来调用我相信应该工作的函数。

但是,当我在 theList 中循环遍历 'i' 并且实际上在循环中附加到它时,我得到了错误“'SQL 包含 1 个参数标记,但提供了 4 个参数','HY000'”。

我猜这源于这样一个事实,即在我的查询中我只想要一个 SSN,但由于我附加到了 theList,它会在不同的列上循环,并且给了我比所需更多的标记(因此提供了 4 个参数,而只需要 1 个参数标记)。

希望这可以帮助像我一样陷入困境的人。

再次感谢beargle和其他花时间帮助我的人!

问候,

于 2013-08-12T09:54:44.380 回答
0

我想象参数需要一个列表并且正在迭代数字。

尝试:

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

传递一个列表。

于 2013-08-06T10:43:18.867 回答