tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: ソースの提示です
投稿日: 2011/01/28(Fri) 15:01
投稿者魔界の仮面弁士
> http://support.microsoft.com/kb/191457/ja

ありがとうございます。
確かにこれでは、DataEnvironment の利用は避けた方が無難かも知れませんね。

使うとしても、デザイン時に MSHFlexGrid や DataGrid の設定を行うための
構造取得ツールとしてのみ利用するぐらいでしょうか。


> 僕の解釈の間違いでしたらすみません

私の方が、「更新」と聞いて「Recordset の編集内容を DB 側に書き戻す」の意味で
捕らえてしまったのですが、そうではなく「DB 側に Requery で問い合わせ直した場合」の
画面表示上の話だったのですね。


一応、Knowledge Base の内容に補足しておくと:

(1)
DataEnvironment 自体を DataSource にバインドしていた場合、
Recordset が更新されたことをコントロール側に伝える手段が無いため、
今回のような現象が発生します。
(ただし、Recordset の Requery メソッド自体は正常に動作しています)


(2)
その Knowledge Base 中では、DataEnvironment を使わずに
 Set DataGrid1.DataSource = DataEnvironment1.rsCustomers
で連結すれば、Requery したあとの再バインドが不要と書かれていますが、
先の投稿(15090) にも書いたように MSHFlexGrid が相手の場合はその限りではなく、
やはり再バインドしなおさないと画面表示に反映されません。
>> Recodset の内容が変化した場合は、DataSource を再度セットする必要があります。


(3)
手順通りに作成した場合、Customers のプロパティは
 DataEnvironment1.rsCustomers.CursorLocation = adUseClient
 DataEnvironment1.rsCustomers.LockType = adLockReadOnly
 DataEnvironment1.rsCustomers.CursorType = adOpenStatic
のように定義されることになります。
いわゆる「読み込み専用のクライアントカーソル」です。

そのため、cmdModifyData ではわざわざ UPDATE SQL を用いて
データを更新していますが、Customers タブで
 カーソルの位置 = クライアント側
 ロックの種類 = オプティミスティック
を指定しておけば、Recordset を直接変更する事も可能ですし、
TextBox や DataGrid を直接書き換えることもできます。

ただしこの場合、UPDATE 文で更新した後、DataSource を再セットせずに
TextBox を書き換えてしまうと、同時更新制御の関係から
 『行が見つからなかっため、更新できません。列の値は
  最後に読み込まれた後で変更された可能性があります。』
のエラーになってしまう可能性があります。

ただし同時更新制御の問題は、DataEnviroment を使わなかった場合にも起こりえます。
(ADO には同時更新制御のための機能も一応ありますが、ここでは触れずにおきます)

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。