• 締切済み

VBAでoracleDBのupdate

VBAでoracleDBにupdate(SQL文)でのアップデートができません。なぜでしょうか? ちなみに、insert、select文は何の問題もなく実行することができます。 Err.Numberは3073(更新できないクリエー)でした。 宜しくお願いします。

みんなの回答

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.5

あ、そっちのほうでしたか(^^; そういう仕様があるのは知っていたんですが、「Insertが出来るんだからコレには該当しないんじゃないか」などと勝手に思っておりました。 主キーが付いていなくても行挿入は出来るんですねぇ。勉強になりました。 でわ。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.4

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側でしょうかねぇ。(基本的なことなんですが、主キーやその他の制約に引っかかったりしてないでしょうか? 或いはトリガが暴発してしまっていたり… 他の処理が排他ロックをしていたりといった可能性は?)

y_s-u
質問者

補足

ありがとうございます。 この問題は解決しました。 なんと、主キーがなければupdateまたはdelete文の実行ができないらしい。(JETワークスペース)の仕様らしい・・・

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

とりあえずは、Oracle側のエラーメッセージは取得できませんでしょうか? oo4oなら、OraSession.LastServerErrortextとかで取得できるはずですし、ADOなら Connection.Errorsだったっけ… それが判れば、Oracleのマニュアルでエラーコードを辞書引きすれば、それとなく原因が見えてくるような気がします。(蛇足になるやも知れませぬが、OTNから電子マニュアルが入手できます。) あとは、該当部分のソースコードや、Oracleのバージョン、使用しているミドルウェア、etcの情報があれば、回答が付き易いと思いますよ。

参考URL:
http://otn.oracle.co.jp/
y_s-u
質問者

補足

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 <- ここでエラーとなってしまいます。 -------------------------------------------- よろしくお願いします。

回答No.2

テーブルの結合はしてないのですか・・・。 どうしてなんでしょうね。UPDATE の SQL と、そのテーブルの各カラムの型を教えてもらえれば、もしかすると何かわかるかもしれません。(が、もしかすると何もわからないかもしれません。) ところで、「更新できないクエリー」というのは、「更新できない SQL です。」という意味だと考えればいいと思います。UPDATE の SQL と INSERT の SQL は異なる SQL なので、「更新できない UPDATE でも、INSERT は大丈夫」というのは意味をなさないと思います。

y_s-u
質問者

補足

ありがとうございます。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 という基本的な文にしてみてもダメでした・・・

回答No.1

おそらく、「更新できないクエリー」だからでしょうね・・・。 二つ以上のテーブルを結合してませんか?一つだけのテーブルの UPDATE だったら正常に実行できたりしませんか?

y_s-u
質問者

補足

ご回答ありがとうございます。 テーブルの結合はしてません。 「更新できないクエリ」であってもインサートは問題ないのですかね?

関連するQ&A

専門家に質問してみよう