25

Python2.6でpyodbcを使用してMicrosoftSQLServer 2005に接続しています。接続を開き、いくつかのカーソルを作成します。

c1 = connection.cursor()
c2 = connection.cursor()

次に、最初のカーソルでクエリを実行します。

c1.execute("select * from foo")

次に、2番目のカーソルでクエリを実行します。

c2.execute("select * from bar")

...そしてエラーが発生します:「接続は別のhstmtの結果でビジーです。」

c1.fetchall()またはを実行した後、c1.close()c2を使用できます。

私の質問は、一度に1つしか使用できず、同じものをいつでも再利用できるのに、接続上に複数のカーソルを作成できるのはなぜですか?そして、次のように、別のクエリの結果の各行に対してクエリを実行する場合は、次のようになります。

for x in c1.execute(...):
    for y in c2.execute(...):

同じデータベースへの複数の接続を実際に作成する必要がありますか?

4

3 に答える 3

23

この男によると

カーソルオブジェクトは、SQLステートメントを実行するために使用されます。ODBCとpyodbcは、接続ごとに複数のカーソルを許可しますが、すべてのデータベースがこれをサポートしているわけではありません。

同時カーソルをサポートできるかどうかは、次の方法で判断できます。

import pyodbc
connection = pyodbc.connect(...)
how_many = connection.getinfo(pyodbc.SQL_MAX_CONCURRENT_ACTIVITIES)
print(how_many)
于 2018-05-17T10:07:28.380 に答える
-2

これはマルチスレッドを介してサポートされているようです:http ://technet.microsoft.com/en-US/library/ms131700(v = sql.90).aspx

于 2013-02-21T22:24:16.470 に答える
-5

私自身の慣習では、複数のデータベースカーソルを使用する必要性に出会ったことはありません。このような問題は、高度なSQLクエリ(結合、グループ)によって解決されるために使用されます。または(パフォーマンスの問題を無視できる場合)、いくつかの簡単なクエリを使用します。

于 2011-04-07T01:16:11.800 に答える