• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オラクルのデータをAccessに追加 無限ループ)

オラクルのデータをAccessに追加 無限ループ

このQ&Aのポイント
  • オラクルのデータをAccessに追加する際に、無限ループが発生しています。取得したレコード数を表示させたところ、-1というありえない数値が表示されました。
  • オラクルからデータを取り出し、Accessのテーブルにデータを追加する処理を行っていますが、処理が終わらずに強制終了をかけると、約150万件のデータが追加されています。
  • オラクル側で同様のSQLを実行したところ、取得件数は48件でした。-1という数値が表示される原因について、ご助言いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Meegeren
  • ベストアンサー率44% (204/459)
回答No.1

基本的なことですが 登録しようとしてるテーブルに主キーはありますか? 気になるのはDo文の終わりのLoopが見当たらないのとrsの次レコード記述が無いことなんですが、欠けているだけ? そうだとすれば、150万件、すべてが同じでデータではないでしょうか

sujino
質問者

お礼

Meegeren様 回答ありがとうございます。 >登録しようとしてるテーブルに主キーはありますか? Access側のテーブルには、主キー(AI)で設定してます。 <気になるのはDo文の終わりのLoopが見当たらないのとrsの次レコード記述が無いことなんですが、欠けているだけ? すいません、LOOP文は私の転記漏れです。 勉強不足ですいません、Untl ~ Loopは勝手に次のレコードにしてくれると思ってました。 >そうだとすれば、150万件、すべてが同じでデータではないでしょうか その通りです、1行目のデータが延々と・・・

sujino
質問者

補足

Meegeren様 みなさん、親切にアドバイス頂き、BAを選択しにくいのですが、最初に間違いをお教え頂いた Meegeren様をBAとさせて頂きます。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

付け忘れに気がついたときはすでに 質問がクローズされていたのでどうしようも なかったので、すみませんでした。

sujino
質問者

お礼

piroin654様 いえいえ、親切にお教え頂き全くわからなかったことが、実装できたので感謝しております。 あわせて、基本的なことなので、メソッドの使い方を理解していれば、気づいたはずです。 まるまる転記せず、理解したうえで実装するよう、心がけます。 勉強になりました、ありがとうございます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

sujino さん、すみません。 つけ忘れがありました。 rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs.Movenext Loop のように rs.Movenext Loop をつけてください。

sujino
質問者

お礼

piroin654様 前回に引き続き、アドバイスありがとうございます。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.2

AccessのRecordCountメソッドって現在位置のレコード番号を返すんじゃなかったかな? だからMoveFIrstもMoveLastも実行していなければ-1になると記憶してます。 RecordCountを使用する場合は直前でMoveLastを実行してください。そして、ループに入る前にMoveFirstで1件目にレコードポイントを戻しておくのを忘れずに… 私の場合、Oracleのリンクテーブルからデータ件数を取得するときは「SELECT COUNT(*) FROM テーブル名 WHERE 抽出条件」でレコード件数を取得してからループさせることがあります。 AccessのMoveLastが非常に時間がかかるケースがたまにあるので… それと、SQL文を組み立てる箇所ですが、毎回「SQL = SQL &」ってやってますよね。 これ、長すぎるとうざくなるのでアンダーバーで改行させるといいと思います。 つまり、 SQL = "SELECT " _ & "カラム1," _ & "カラム2," _ & "カラム3" _ & "FROM オラクルテーブル名 " _ & "WHERE 抽出条件 " _ & "AND 抽出条件" _ & "GROUP BY カラム" と記述することが出来ます。 実際には2行目以降は先頭にスペースを挿入して見やすくします。 ※ここでは行頭のスペースは削除されてしまうので…

sujino
質問者

お礼

bardfish様 回答ありがとうございます。 >AccessのRecordCountメソッドって現在位置のレコード番号を返すんじゃなかったかな? ネットで調べた情報をよく理解せずに使ってたので、お恥ずかしい限りです。 PL/SQL側でSQLのテストを実施して、大体のレコード数を把握してVBAに書いているので、問題はないと安易に考えておりました。 確かに、VBA側でレコード数をカウントしたほうがいいですね。 勉強になりました。 >それと、SQL文を組み立てる箇所ですが、毎回「SQL = SQL &」ってやってますよね。 これ、長すぎるとうざくなるのでアンダーバーで改行させるといいと思います。 以前、多段サブクエリSQLを書いた時に、”_”の数が多すぎて、実装できなかった事があったので、”_”に拒否感があるのだと思います。 自己流の知識の初心者なので、勉強になりました、ありがとうございます。