- ベストアンサー
ACCESSでORACLEのサーバからデータを取得する方法
- ACCESSでORACLEのサーバからデータを取得しようと試みましたがうまくいきません。どこを改善したらよろしいでしょうか?どなたかご教示ください。
- 以下のエラーメッセージがVBAで表示されます。「[Microsoft][ODBC driver for Oracle][Oracle]ORA-00923: FROMキーワードが指定の位置にありません。」SQL部分の空白は見直しました。
- 単一のテーブルであればDoCmd.TransferDatabase acImport等を使うのですが、場合によっては今後データ量が多かったりより複数のテーブルを扱うことになるため、どのようにデータを取得すればよいかアドバイスをいただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です > While(Not rs.EOF) > rsTo.AddNew > rsTo!SBN = rs!SBN > ・・・ > rsTo.Update > rs.MoveNext > Wend ここのところの rsTo は、AddNew / Update しかしていないので DAO / ADO 区別ありません。 Dim rsTo As DAO.Recordset と記述して、メニューの「デバッグ」→「コンパイル」してみて エラーにならなければ、DAO が使えます。(以下雰囲気) Set rs = adoCON.Execute(sqlstr) CurrentDb.Execute "DELETE FROM SAMPLE_T;" Set rsTo = CurrentDb.OpenRecordset("SAMPLE_T") While (Not rs.EOF) rsTo.AddNew rsTo!SBN = rs!SBN ・・・ rsTo.Update rs.MoveNext Wend rs.Close rsTo.Close また、 Dim rsTo As New ADODB.Recordset でコンパイルエラーでなければ ADO が使えます(以下雰囲気) Set rs = adoCON.Execute(sqlstr) CurrentProject.Connection.Execute "DELETE FROM SAMPLE_T;" rsTo.Open "SAMPLE_T", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic While (Not rs.EOF) rsTo.AddNew rsTo!SBN = rs!SBN ・・・ rsTo.Update rs.MoveNext Wend rs.Close rsTo.Close ※ コンパイルエラーでも、使いたいのであれば、参照設定で追加すれば良いと思います ※ 参照設定しなくても、質問者さんの様に(チョッと修正) Dim cn As Object Dim rsTO As Object Set cn = CurrentProject.Connection Set rsTO = CreateObject("ADODB.Recordset") rsTO.Open "SAMPLE_T", cn, adOpenForwardOnly, adLockOptimistic ' ★ Object 宣言しておいて、CreateObject("ADODB.Recordset") することでも同じなのですが adOpenForwardOnly とか adLockOptimistic の様な定数部分の記述で苦労すると思います。 Dim rsTO As ADODB.Recordset としておけば、 Set rsTO = CreateObject("ADODB.Recordset") ↓部分は、 Set rsTO = New ADODB.Recordset で良いですし、 Dim rsTO As New ADODB.Recordset としておけば、Set rsTO = ・・・ 自体不要です
その他の回答 (1)
- 30246kiku
- ベストアンサー率73% (370/504)
ORACLE との連携部分はわかりませんが > sqlstr = "SELECT J.KTN_COD,J.SBN,J.GYOSYA_COD,G.GYOSYA_MEI" _ > & "FROM JITU_SHARYOU J ,GYOSYA G" _ > & "WHERE J.GYOSYA_COD = G.GYOSYA_COD" FROM と WHERE 前にスペースが無いため・・・ ではないでしょうか。 余計なお世話で rs (Recordset)のメソッドに、GetRows があります。 GetRows を使えば、簡単に配列データが作れます。 Dim v As Variant ・・・ v = rs.GetRows v は、v(列,行) の二次元配列に なお、レコード数がかなり多いのであれば、配列に展開するのではなく SAMPLE_T 用の Recordset rsTo を開いておいて While(Not rs.EOF) rsTo.AddNew rsTo!SBN = rs!SBN ・・・ rsTo.Update rs.MoveNext Wend とかすれば・・・
お礼
できました、ありがとうございます。普段SQLエディタで抽出していたので気づきませんでした。 ちなみに「SAMPLE_T 用の Recordset rsTo を開いておいて・・・」というやりかたをもう少し 詳しく教えて頂いてもよろしいでしょうか? while文の前に Dim rsTO As Object Set cn = CreateObject("ADODB.Connection") Set rsTO = CreateObject("ADODB.Recordset") rsTO.Open "SAMPLE_T", cn.... としたのですが、「この操作を実行するために接続を使用できません。 このコンテキストで閉じているかあるいは無効です。」と出てきて うまくいきませんでした。access2010を使用していますが、DAOの 参照設定が必要になるのでしょうか?
お礼
ありがとうございます、助かりました。おかげさまで実現できました。御礼申し上げます。