![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ACCESSでORACLEのサーバからデータを取得しようと試みましたがうまくいきません。どこを改善したらよろしいでしょうか?どなたかご教示ください。
クライアント:WINDOWS7 ACCESS2010 サーバ:WIN-SV2003 ORACLE10G
以下のエラーがVBAで取得しようとするとでてきてしまいます。
「[Microsoft][ODBC driver for Oracle][Oracle]ORA-00923:FROMキーワードが指定の位置にありません。」
SQL部分の空白は見直しました。
Private Sub コマンド610_Click()
Dim adoCON As Object
Dim rs As Object
Dim oraclebox() As Variant
Dim rdsu As Long
On Error GoTo Err_Han
'データベースに接続する'
Set adoCON = CreateObject("ADODB.Connection")
adoCON.Open "Driver={Microsoft ODBC for Oracle};" & _
"CONNECTSTRING=*****; UID=abcd; PWD=1234;"
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"
Set rs = adoCON.Execute(sqlstr)
rs.MoveFirst
'レコード数カウント'
Do Until rs.EOF
rdsu = rdsu + 1
rs.MoveNext
Loop
'配列を再定義'
ReDim oraclebox(rdsu, 4)
i = 1
rs.MoveFirst
Do Until rs.EOF
oraclebox(i, 1) = rs!KTN_COD
oraclebox(i, 2) = rs!SBN
oraclebox(i, 3) = rs!GYOSYA_COD
oraclebox(i, 4) = rs!GYOSYA_MEI
i = i + 1
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
'警告ダイアログをオフ'
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE FROM SAMPLE_T"
'Oracleデータを書き込み'
For i = 1 To rdsu
DoCmd.RunSQL "INSERT INTO SAMPLE_T(KTN_COD,SBN,GYOSYA_COD,GYOSYA_MEI)" _
& "VALUES('" & oraclebox(i, 1) & "','" & oraclebox(i, 2) & "','" & oraclebox(i, 3) & "'," & oraclebox(i, 4) & ")"
Next i
'警告ダイアログをオン'
DoCmd.SetWarnings True
Exit Sub
Err_Han:
' エラー処理'
MsgBox (Err.Description)
End Sub
*単一のテーブルであればDoCmd.TransferDatabase acImpor等を使うのですが、場合によっては今後データ量が多かったりより複数のテーブルを扱うことになるので。
No.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 = ・・・ 自体不要です
No.1
- 回答日時:
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の
参照設定が必要になるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
構造体配列内の文字列検索のよ...
-
Dir関数で読み取り順を操作でき...
-
定数配列の書き方
-
vba フィルター 複数条件 3つ以...
-
VB6のメモリ解放に関して
-
複数のtextboxの処理を一括で行...
-
Redim とEraseの違いは?
-
COBOLの基本的な事なので...
-
配列の中から最大値だけ取り出...
-
VB6でやると構造体の配列になる...
-
OutOfMemoryExceptionの回避策...
-
Excelのメモリ(配列)の上限は2G...
-
Excel2010のinputboxで複数デー...
-
VBScript で ADO Streamオブジ...
-
C++で作成したDLLにVBAから配列...
-
デバイスマネージャーの一覧取得
-
配列の中の最大値とそのインデ...
-
配列をランダムに並び替えても...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報