質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

6194閲覧

UPDATE文が処理されない

f-hanako

総合スコア159

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2015/06/16 09:50

編集2015/06/17 01:42

VB6で作成しているシステム上から、SQLを発行し、
oo4oでレコードを編集しようとしています。
VB6のソースの一部を記載します。

lang

1'ダイナセットを作成する' 2Dim vstrSql As String 3Dim V_Arsl1 As OraDynaset 4Dim V_Arsl2 As OraDynaset 5 6vstrSql = "SELECT FROM DB_START WHERE ID = '00001' 7Set V_Arsl1 = g_oo4o_DB.CreateDynaset(vstrSql, ORADYN_NO_BLANKSTRIP + ORADYN_NOCACHE) 8 9vstSQL = "SELECT * FROM DB_A &_ 10WHERE NO_A IN ( &_ 11SELECT NO_B FROM DB_B WHERE ID = '012345')" 12Set V_Arsl2 = g_oo4o_DB.CreateDynaset(vstrSql, ORADYN_NO_BLANKSTRIP + ORADYN_NOCACHE) 13 14'(中略)' 15'ダイナセット1での更新処理' 16V_Arsl1.Edit 17 If V_Arsl1.EOF = False Then 18 Do Until V_Arsl1.EOF 19 V_Arsl1("FLG") = '0' 20 21 V_Arsl1.Update 22 V_Arsl1.MoveNext 23 Loop 24 Else 25 V_Arsl1.Close 26 Set V_Arsl1 = Nothing 27 End If 28 29'ダイナセット2の解放' 30V_Arsl.Close 31Set V_Arsl = Nothing 32 33'ダイナセット2での更新処理' 34V_Arsl2.Edit '//ここでエラーが出る' 35 If V_Arsl2.EOF = False Then 36 Do Until V_Arsl2.EOF 37 V_Arsl2("FLG") = '0' 38 39 V_Arsl2.Update 40 V_Arsl2.MoveNext 41 Loop 42 Else 43 V_Arsl2.Close 44 Set V_Arsl2 = Nothing 45 End If 46 47'ダイナセット2の解放' 48V_Arsl2.Close 49Set V_Arsl2 = Nothing 50

これを実行すると、

「実行時エラー440 OIP-04117 更新可能なセットではありません」

とエラーが出てしまいます。

このダイナセットの前に、別のダイナセットを作成して更新処理を行っています。
こちらのダイナセットでの更新処理は成功しています。

SQL文が問題なのかと思っているのですが、原因がわかりません。
ご教示いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

  1. 成功する側のCreateDynasetは提示頂いたCreateDynasetと同一のコードですか?
  2. 他のダイナセットのEdit中でロックされているということはないですか?

投稿2015/06/17 01:18

編集2015/06/17 01:19
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

f-hanako

2015/06/17 01:45

回答ありがとうございます。 > 1. 成功する側のCreateDynasetは提示頂いたCreateDynasetと同一のコードですか? すみません、ダイナセットは2つ用意しており、 順番に別のダイナセットで更新処理を行っております。 (ソースのほう編集いたしました。) >2.他のダイナセットのEdit中でロックされているということはないですか? 実際のソースでは以下のように処理を行っているのですが、 これではダイナセット1にロックがかかり、 ダイナセット2の処理に進まないということでしょうか? -----------------------------------  'ダイナセット1作成  'Dim V_Arsl As OraDynaset  'ダイナセット2作成  Dim V_Arsl2 As OraDynaset   ' ダイナセット1での更新処理  V_Arsl1.Edit   (中略)  V_Arsl1.Update   ' ダイナセット1の解放   ' ダイナセット2での更新処理  V_Arsl2.Edit   (中略)  V_Arsl2.Update   ' ダイナセット2の解放 -----------------------------------
Tak1wa

2015/06/17 01:52

※oo4oの使用経験があまり無いので的はずれな回答をしていたらすみませんね。 まず問題の切り分けとして二つのダイナセットが影響しあっているのか、単体でダイナセット2に問題があるのかを確認することは出来ると思います。 1.ダイナセット1の処理をコメントアウトした場合にダイナセット2は動作しますか? 2.1で動作しないのであればダイナセット2自体に問題がありますね。その場合ダイナセット2に対してダイナセット1のSQL文を使用した場合であれば成功しますか?
f-hanako

2015/06/17 02:14

提示された二つについて実行してみました。 >1.ダイナセット1の処理をコメントアウトした場合にダイナセット2は動作しますか? ダイナセット2は動作しませんでした。 >2.1で動作しないのであればダイナセット2自体に問題がありますね。その場合ダイナセット2に対してダイナセット1のSQL文を使用した場合であれば成功しますか? ダイナセット1をコメントアウトして、ダイナセット1のSQL文を使用したところ、更新に成功しました。
Tak1wa

2015/06/17 02:18

ではSQL文がおかしい可能性が高いです。 VB6の文法を忘れてしまいましたが…。 >"SELECT * FROM DB_A &_ >WHERE NO_A IN ( &_ >SELECT NO_B FROM DB_B WHERE ID = '012345')" これは "SELECT * FROM DB_A " &_ "WHERE NO_A IN ( " &_ "SELECT NO_B FROM DB_B WHERE ID = '012345')" ではなかったでしたっけ。
f-hanako

2015/06/17 02:31

すみません、こちらでは見やすいように改行を加えていますが、実際は  "SELECT * FROM DB_A WHERE NO_A IN ( SELECT NO_B FROM DB_B WHERE ID = '012345')" と一行で設定しております。 また、このSQL文を単体で実行したところ、Common SQL Environmentからは対象のレコードが抽出されております。
Tak1wa

2015/06/17 02:49

ダイナセットのupdatebleはTrueになってますか? oo4oのバージョンを教えてください。
f-hanako

2015/06/17 03:20

ありがとうございました。解決いたしました。 初めにTak1waさんが提示していた > 他のダイナセットのEdit中でロックされているということはないです こちらが原因でした。 別に起動していたCommon SQL Environmentで、DBをレコードをロックしていたようでした……。 お騒がせいたしました。
f-hanako

2015/06/17 03:57

また、複合SQL文ではうまくいかないと判断し、先にダイナセットからNO_A だけを配列に保管し、それを読み出して一行一行更新していく方法にいたしました。 こちらに変更したところ、更新処理に成功しました。 ----------------------------------- Dim V_NoArray() As Variant Dim V_NoCnt As Long '(中略)' If V_Arsl2.EOF = False Then Do Until V_Arsl2.EOF ReDim Preserve V_NoArray(V_NoCnt) V_NoArray(V_NoCnt) = V_Arsl2("NO_A) V_NoCnt = V_NoCnt + 1 V_Arsl2.MoveNext Loop End If V_Arsl2.Close Set V_Arsl2 = Nothing vstSQL = "SELECT * FROM DB_A WHERE NO_A ='" & Array(i) & "'" Set V_Arsl2 = g_oo4o_DB.CreateDynaset(vstrSql, ORADYN_NO_BLANKSTRIP + ORADYN_NOCACHE) If V_Arsl2.EOF = False Then Do Until V_Arsl2.EOF V_Arsl2("FLG") = '0' V_Arsl2.Update V_Arsl2.MoveNext Loop Else V_Arsl2.Close Set V_Arsl2 = Nothing End If V_Arsl2.Close Set V_Arsl2 = Nothing ----------------------------------- 迅速な回答ありがとうございました。
guest

0

対象テーブルの更新権限は大丈夫でしょうか?

oo4oドライバが最新でない場合を最新化してみるとか。

最悪ExecuteSQLで実行してみるなど。。

投稿2015/06/16 10:09

chiku_

総合スコア1464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

f-hanako

2015/06/17 00:42

回答ありがとうございます。 > 対象テーブルの更新権限は大丈夫でしょうか? 同ソース内の別の処理では、対象テーブルに対してレコードの追加を行っており、正しく処理されております。 また、Common SQL EnvironmentというソフトウェアからDBへ接続して、以下のようなアップデート文を実行したところ、更新を行うことができました。 UPDATE DB_A SET FLG= '0' WHERE NO_A IN ( &_ SELECT NO_B FROM DB_B WHERE ID = '012345')" >最悪ExecuteSQLで実行してみるなど。。 こちらのほうを検討してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問