- - PR -
データテーブル、データグリッド更新の排他制御
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-11-25 07:48
通信によるイベント処理とユーザーからのキー操作によるDB
更新で System.Data: オブジェクト参照がオブジェクト インスタンスに設定されていません。 at System.Data.DataColumnPropertyDescriptor.GetValue(Object component) at System.Windows.Forms.DataGridColumnStyle.GetColumnValueAtRow(CurrencyManager source, Int32 rowNum) at System.Windows.Forms.DataGridTextBoxColumn.Paint(Graphics g, Rectangle bounds, CurrencyManager source, Int32 rowNum, Brush backBrush, Brush foreBrush, Boolean alignToRight) at System.Windows.Forms.DataGridRelationshipRow.PaintCellContents(Graphics g, Rectangle cellBounds, DataGridColumnStyle column, Brush backBr, Brush foreBrush, Boolean alignToRight) at System.Windows.Forms.DataGridRow.PaintData(Graphics g, Rectangle bounds, Int32 firstVisibleColumn, Int32 columnCount, Boolean alignToRight) at System.Windows.Forms.DataGridRelationshipRow.Paint(Graphics g, Rectangle bounds, Rectangle trueRowBounds, Int32 firstVisibleColumn, Int32 numVisibleColumns, Boolean alignToRight) at System.Windows.Forms.DataGrid.PaintRows(Graphics g, Rectangle& boundingRect) at System.Windows.Forms.DataGrid.PaintGrid(Graphics g, Rectangle gridBounds) at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.ComponentManager.System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) という様な異常が出ます。仮のテストコードは以下です。 // メインフォーム AddHandler ProdSchCtrl.DataReqEvent, AddressOf datareq Private o As New Object Private o2 As New Object Private datareqct As Integer = 0 Private Sub DB_Update() SyncLock o Try OleDbDataAdapter1.Update(DataSet11) Catch ex As Exception Debug.WriteLine(ex.Message & ex.StackTrace, ex.Source) End Try End SyncLock End Sub Private Sub Table_Update(ByVal i As Integer) SyncLock o2 Try DataSet11.ProductSchedule.Rows(i)("SURYOU") += 1 Catch ex As Exception Debug.WriteLine(ex.Message & ex.StackTrace, ex.Source) End Try End SyncLock End Sub Private Sub DataReq() Try If DataSet11.ProductSchedule.Rows(ct + 1)("SURYOU") = DataSet11.ProductSchedule.Rows(ct + 1)("YOTEI") Then ct += 1 Else Table_Update(ct) DB_Update() End If Catch ex As Exception Debug.WriteLine(ex.Message & ex.StackTrace, ex.Source) End Try End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try If DataSet11.ProductSchedule.Rows(ct)("SURYOU") = DataSet11.ProductSchedule.Rows(ct)("YOTEI") Then ct += 1 Else Table_Update(ct) DB_Update() End If Catch ex As Exception Debug.WriteLine(ex.Message & ex.StackTrace, ex.Source) End Try End Sub //タイマーイベントを発生させるクラス Public Sub WatchTimerStart() If ReqTimer Is Nothing Then ReqTimerCallback = New System.Threading.TimerCallback(AddressOf WatchAutoReq) ReqTimer = New System.Threading.Timer(ReqTimerCallback, Nothing, 0, 100) Else AutoReqWatchTimerStart() End If End Sub Private Sub AutoReqWatchTimerStart() ReqTimer.Change(0, 100) End Sub Public Sub WatchTimerStop() ReqTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite) End Sub Public Event DataReqEvent() Private Sub WatchAutoReq(ByVal state As Object) RaiseEvent DataReqEvent() End Sub 上記データテーブルはデータグリッドに関連付けています。 フォームのタイマーとタイマーイベントを発生させるクラスにより データテーブルの更新、DBの更新を行っています。 これを実行すると、上記のtry catchでは拾えず、上記の様なメッセージが でます。データグリッドの描画異常の様です。 確実に排他制御を行うにはどの様にしたら良いのでしょう。 ご教授願います。 | ||||
|
投稿日時: 2005-11-25 19:18
OnPaint で発生しているのだから、拾えるはずがありませんね。 で、何と何を排他制御したいのでしょう?私はてっきり、データベース上にあるテーブルの操作を排他制御するのかと思っていました。 ご教示とご教授→http://blogs.wankuma.com/jeanne/archive/2005/11/24/19566.aspx ___________________________________________________________________ □ written by Jitta on 2005/11/25 □ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||
|
投稿日時: 2005-11-26 08:53
説明不足で申し訳ありません。
やりたいことは、外部からのイベントによる データテーブル、DBの更新と、ユーザー操作 による更新をエラーのでないようにしたいだ けです。 排他制御とは違います?同期? 一応、MSDNを参照してSyncLockを使用している つもりなのですが、異常が発生します。 重ね重ねご教示願います。 | ||||
|
投稿日時: 2005-11-26 09:14
この例外って件名にあるような排他制御と何の関係があるんでしょうか? 関連性が判りませんでしたが、まず例外を除くのが第一ですよね。 排他制御はその後に考えましょう。 OnPaint で例外が起きるのは判りましたが、 具体的に "どこで" OnPaint へ入っているか教えてください。 要するに、デバッグをして情報をくださいということです。 Visual Studio を使っているのであれば、ステップ実行ができるので絞れます。 # 存在しないカラムを描画の後に見に行ってる? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-11-26 10:30
OnPaintはどこにもオーバーライドしていません。
Form上にDataGridを配置してDataset,DataTableを あてているだけです。 両タイマーを作動させ、イベントとタイマーによる 更新操作が始まった直後に画面が止まり、フリーズ します。 上記例外は、 try Application.Run(New Form1) catch で拾いました。 ステップ実行でも各行は問題なく通過します。 よろしくお願いします。 | ||||
|
投稿日時: 2005-11-26 12:22
[デバッグ] - [例外] にある「Common Language Runtime Exceptions」を「デバッガで中断」を選択。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-11-26 20:13
あ〜〜〜?書いていたのに消している・・・
表示でエラーになっているのは、「表示しようとしているデータが、表示のための器に合っていないから」です。この二つのずれを見つけ出す必要があります。 DataGrid の設定と、表示しようとしているデータをつきあわせてください。 ___________________________________________________________________ □ written by Jitta on 2005/11/26 □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ |
1