pyodbc.ProgrammingError:尝试使用关闭的游标

时间:2014-05-22 12:28:47

标签: python-3.x

我在班上有这个方法:

def exec_query(self, dbms, connection_string, sql):
    self.dbms = dbms
    self.connection_string = connection_string
    self.sql = sql
    self._connection, self._cursor = self._mydb(self.dbms, self.connection_string)
    self._result = None
    self.query_result = []
    try:
        self._cursor.execute(self.sql)
        self.collected_data = self._cursor
    except Exception as e:
        raise e
    self._cursor.close()
    self._connection.close()
    return self.collected_data

然后我试着在课外得到它的回报值。我收到了这个错误:

pyodbc.ProgrammingError: Attempt to use a closed cursor.

我不能将光标分配给变量吗?为什么?

我想要做的是将光标处理在类之外。基本上,我可以做.fetchall()并获取数据,然后关闭光标。但.fetchall()吃掉了记忆。所以,我想把光标处理到外面。

1 个答案:

答案 0 :(得分:0)

self.collected_data只是与self._cursor完全相同的对象的另一个名称。如果您关闭self._cursor,则self.collected_data也会关闭。

您需要使用

self.collected_data = self.cursor.fetch_all()

(或其他)保存实际数据,或保持连接和光标打开,在类外处理数据,然后调用close方法。

您可能希望将您的课程设为context manager,然后使用以下内容:

with db_connection.exec_query(dbms, connection_string, sql) as data:
    # process data
    while data:
        row in data.fetch_one()
        do_something_with_row()
# on exit, cursor is closed

我可能有while data错误的详细信息,但希望你能得到这个想法。你的exec_query看起来像这样:

class exec_query:
    def __init__(self, dbms, connection_string, sql):
        self.dbms = dbms
        self.connection_string = connection_string
        self.sql = sql
        self._connection, self._cursor = self._mydb(self.dbms, self.connection_string)
        self._result = None
        self.query_result = []
        self._cursor.execute(self.sql)
    def __enter__(self):
        return self._cursor
    def __exit__(self, *args):
        self._cursor.close()
        self._connection.close()