- PR -

データテーブル、データグリッド更新の排他制御

1
投稿者投稿内容
イシヨシ
会議室デビュー日: 2005/11/25
投稿数: 5
投稿日時: 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では拾えず、上記の様なメッセージが
でます。データグリッドの描画異常の様です。
確実に排他制御を行うにはどの様にしたら良いのでしょう。
ご教授願います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-25 19:18
引用:

イシヨシさんの書き込み(2005-11-25 07:48)より:

これを実行すると、上記のtry catchでは拾えず、上記の様なメッセージが
でます。データグリッドの描画異常の様です。
確実に排他制御を行うにはどの様にしたら良いのでしょう。


 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/25
投稿数: 5
投稿日時: 2005-11-26 08:53
説明不足で申し訳ありません。
やりたいことは、外部からのイベントによる
データテーブル、DBの更新と、ユーザー操作
による更新をエラーのでないようにしたいだ
けです。
 排他制御とは違います?同期?
一応、MSDNを参照してSyncLockを使用している
つもりなのですが、異常が発生します。
重ね重ねご教示願います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-26 09:14
引用:

イシヨシさんの書き込み (2005-11-26 08:53) より:

やりたいことは、外部からのイベントによる
データテーブル、DBの更新と、ユーザー操作
による更新をエラーのでないようにしたいだけです。
排他制御とは違います?同期?
一応、MSDNを参照してSyncLockを使用している
つもりなのですが、異常が発生します。
重ね重ねご教示願います。


この例外って件名にあるような排他制御と何の関係があるんでしょうか?
関連性が判りませんでしたが、まず例外を除くのが第一ですよね。
排他制御はその後に考えましょう。

OnPaint で例外が起きるのは判りましたが、
具体的に "どこで" OnPaint へ入っているか教えてください。
要するに、デバッグをして情報をくださいということです。

Visual Studio を使っているのであれば、ステップ実行ができるので絞れます。

# 存在しないカラムを描画の後に見に行ってる?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
イシヨシ
会議室デビュー日: 2005/11/25
投稿数: 5
投稿日時: 2005-11-26 10:30
OnPaintはどこにもオーバーライドしていません。
Form上にDataGridを配置してDataset,DataTableを
あてているだけです。
両タイマーを作動させ、イベントとタイマーによる
更新操作が始まった直後に画面が止まり、フリーズ
します。
上記例外は、
try
Application.Run(New Form1)
catch
で拾いました。
ステップ実行でも各行は問題なく通過します。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-26 12:22
引用:

イシヨシさんの書き込み (2005-11-26 10:30) より:

上記例外は、
try
Application.Run(New Form1)
catch
で拾いました。
ステップ実行でも各行は問題なく通過します。


[デバッグ] - [例外] にある「Common Language Runtime Exceptions」を「デバッガで中断」を選択。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)