- 締切済み
VBAでoracleDBのupdate
VBAでoracleDBにupdate(SQL文)でのアップデートができません。なぜでしょうか? ちなみに、insert、select文は何の問題もなく実行することができます。 Err.Numberは3073(更新できないクリエー)でした。 宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- ARC
- ベストアンサー率46% (643/1383)
あ、そっちのほうでしたか(^^; そういう仕様があるのは知っていたんですが、「Insertが出来るんだからコレには該当しないんじゃないか」などと勝手に思っておりました。 主キーが付いていなくても行挿入は出来るんですねぇ。勉強になりました。 でわ。
- ARC
- ベストアンサー率46% (643/1383)
DAOでOracleにつないだ経験は殆ど無いですし、自宅にOracle入れているわけでもないので、甚だ不確実な回答ではありますが、 Private Sub コマンド0_Click() Dim wspc As DAO.Workspace Dim conn As DAO.Connection Dim sSql As String Set wspc = DAO.CreateWorkspace("WSPC_NAME", "USER_NAME", "PASSWORD", dbUseODBC) Set conn = wspc.OpenConnection("hoge", dbDriverNoPrompt, False _ , "ODBC;dsn=hoge;Trusted_Connection = yes") sSql = "" sSql = sSql & "UPDATE TEST1 SET NAME = 'V' WHERE NO = 9" conn.Execute sSql, dbExecDirect conn.Close Set conn = Nothing wspc.Close Set wspc = Nothing End Sub みたいな書き方をしてもダメでしょうかねぇ。 (ちなみに、接続文字列はMSDE用のものなんで、適当に書き換えてやってください。) ODBC Directで繋いでるんで、もしこれで成功するようであれば、原因がDAOのどっかにある可能性が高くなりますよね。 上記でもダメだったとしたら、Oracle側でしょうかねぇ。(基本的なことなんですが、主キーやその他の制約に引っかかったりしてないでしょうか? 或いはトリガが暴発してしまっていたり… 他の処理が排他ロックをしていたりといった可能性は?)
- ARC
- ベストアンサー率46% (643/1383)
とりあえずは、Oracle側のエラーメッセージは取得できませんでしょうか? oo4oなら、OraSession.LastServerErrortextとかで取得できるはずですし、ADOなら Connection.Errorsだったっけ… それが判れば、Oracleのマニュアルでエラーコードを辞書引きすれば、それとなく原因が見えてくるような気がします。(蛇足になるやも知れませぬが、OTNから電子マニュアルが入手できます。) あとは、該当部分のソースコードや、Oracleのバージョン、使用しているミドルウェア、etcの情報があれば、回答が付き易いと思いますよ。
- 参考URL:
- http://otn.oracle.co.jp/
補足
DBアクセスには「DAO」を使っています。 該当部分のソースコードは以下のようになっています。 -------------------------------------------- Dim WkDB As Workspace Dim Db As Database Dim Connect As String Dim SQL As String Set WkDB = DBEngine.Workspaces(0) WkDB.BeginTrans Connect = "ODBC; " & _ "UID=" & _ ユーザ名 & _ ";PWD=" & _ パスワード Set Db = Workspaces(0).OpenDatabase( _ DataSorce名, _ False, _ False, _ Connect _ ) SQL = "アップデート文" Db.Execute SQL <- ここでエラーとなってしまいます。 -------------------------------------------- よろしくお願いします。
- tsukasa-12r
- ベストアンサー率65% (358/549)
テーブルの結合はしてないのですか・・・。 どうしてなんでしょうね。UPDATE の SQL と、そのテーブルの各カラムの型を教えてもらえれば、もしかすると何かわかるかもしれません。(が、もしかすると何もわからないかもしれません。) ところで、「更新できないクエリー」というのは、「更新できない SQL です。」という意味だと考えればいいと思います。UPDATE の SQL と INSERT の SQL は異なる SQL なので、「更新できない UPDATE でも、INSERT は大丈夫」というのは意味をなさないと思います。
補足
ありがとうございます。SQL文の問題ですかね? SQL文は以下のような形になります。ちょっとわかりにくいかもしれません。 このSQL文はSQLPLUS上ではちゃんと処理されます。 UPDATE XXXXXX SET ~~~~=176811,~~~~=177521,~~~~=178231,~~~~=168853,~~~~=169364,~~~~=170130,~~~~=1040910,~~~~=170148,~~~~=170166,~~~~=170184,~~~~=170202,~~~~=170220,~~~~=170238,~~~~=1021158,~~~~=1191396 WHERE YYYYY=1 AND YYYYY='001' AND YYYYY='200000' AND YYYYY=1 AND YYYYY=1998 ちなみに、 UPDATE XXXXX SET ~~~~=0 という基本的な文にしてみてもダメでした・・・
- tsukasa-12r
- ベストアンサー率65% (358/549)
おそらく、「更新できないクエリー」だからでしょうね・・・。 二つ以上のテーブルを結合してませんか?一つだけのテーブルの UPDATE だったら正常に実行できたりしませんか?
補足
ご回答ありがとうございます。 テーブルの結合はしてません。 「更新できないクエリ」であってもインサートは問題ないのですかね?
補足
ありがとうございます。 この問題は解決しました。 なんと、主キーがなければupdateまたはdelete文の実行ができないらしい。(JETワークスペース)の仕様らしい・・・