タイトル : 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 には同時更新制御のための機能も一応ありますが、ここでは触れずにおきます) |