web-dev-qa-db-ja.com

RMySQLの結果セットを閉じる方法は?

インポートデータベースにRMySQLを使用しました。接続を閉じようとすると、次のエラーが表示されます。

Error in mysqlCloseConnection(conn, ...) : 
  connection has pending rows (close open results set first)

コンピューターを再起動する以外にこれを修正する方法はありません。解決できることはありますか?ありがとう!

39
lokheart

メソッドdbClearResultを使用できます。
例:

dbClearResult(dbListResults(conn)[[1]])
47
Steve Qian

Multiplexerが指摘したように、結果セットの一部を残しておくことで、おそらくそれを間違っています。

DBIおよびRMySQLのようなアクセサパッケージには、時々少し難しいドキュメントがあります。結果セット全体を一度に取得するdbGetQuery()を使用するように心がけています。 CRANberriesコードからの短いスニペットは次のとおりです。

sql <- paste("select count(*) from packages ",
             "where package='", curPkg, "' ",
             "and version='", curVer, "';", sep="")
nb <- dbGetQuery(dbcon, sql)

この後、私は心配することなく閉じることができます(または他の操作を実行できます)。

14
rs<- dbGetQuery(dbcon, sql)
data<-dbFetch(rs)
dbClearResult(rs)

クエリを続行すると、最後の行で次のエラーが削除されました

Error in .local(conn, statement, ...) : 
  connection with pending rows, close resultSet before continuing
3
stda

以前の回答で説明したように、RMysqlはクエリの結果をすべて返さなかったため、このエラーが発生します。
結果が500を超える場合、この問題が発生しました:

my_result <- fetch( dbSendQuery(con, query))

fetchのドキュメントを見ると、取得したレコードの数を指定できることがわかりました。

n =フェッチごとに取得するレコードの最大数。保留中のすべてのレコードを取得するには、n = -1またはn = Infを使用します。

ソリューション:

1-レコード数を無限大に設定します:my_result <- fetch( dbSendQuery(con, query), n=Inf)

2- dbGetQueryを使用します:my_result <- dbGetQuery(con, query)

1
Mnl

接続を閉じる前に結果セットを閉じる必要があります。保留中の行がある結果セットを閉じる前に接続を閉じようとすると、マシンがハングすることがあります。

Rmysqlについてはあまり知りませんが、最初に結果セットを閉じてみてください。

1
User 1034

結果の設定については自分で覚えておく必要があります。以下の例では、結果を閉じる/クリアする方法と、影響を受ける行を取得する方法があります。問題を解決するには、送信したステートメントまたはクエリから結果を取得する変数の最後のコード行を使用します。 :)

statementRes <- DBI::dbSendStatement(conn = db,
                     "CREATE TABLE IF NOT EXISTS great_dupa_test (
                        taxonomy_id INTERGER NOT NULL,
                        scientific_name TEXT);")
DBI::dbGetRowsAffected(statementRes)
DBI::dbClearResult(statementRes)
0
koralgooll