- PR -

ActiveReportsのSELECT文で取得したレコード数が不正

1
投稿者投稿内容
篇銀
常連さん
会議室デビュー日: 2005/06/01
投稿数: 26
投稿日時: 2006-10-14 11:32
こんにちは。篇銀です。
アドバイスを頂けないでしょうか。

【動作環境】
Microsoft Windows XP Professional
Microsoft Visula Basic 2005
ActiveReports for .NET 2.0J Standard Edition

【事象】
休日のため、質問させてください。
Seikyu2サンプルをベースにアプリを作成中です。
rptSeikyu_DataInitialize()の中で以下のようにコーデングしています。
TBL1のレコードが4件の状態で、連続してActiveReportsを呼び出すと、MAX_mCntが3になる場合があります。
なぜこのような事象が発生するのでしょうか?

【コード例】
strMainSQL = "SELECT RETSU1 FROM TBL1"
myConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Seikyu2.mdb;Persist Security Info=False")
MainDataAdapter = New OleDbDataAdapter(strMainSQL, myConnection)
MainDataAdapter.Fill(myDataSet, "tb_Main")
MAX_mCnt = myDataSet.Tables("tb_Main").Rows.Count

以上
篇銀
常連さん
会議室デビュー日: 2005/06/01
投稿数: 26
投稿日時: 2006-10-18 17:13
こんにちは。補足します。
処理の流れは以下の通りです。
(1) MDBのテーブルを操作し、ActiveReports側で使うテンポラリのテーブル(TBL1)にデータを書き込みします。(毎回TBL1の全レコード削除)
(2) 以下のコードで、ActiveReportsを呼び出します。
Dim frmSeikyu2Dlg As frmSeikyu2
frmSeikyu2Dlg = New frmSeikyu2()
frmSeikyu2Dlg.ShowDialog()
(3) SELECT RETSU1 FROM TBL1を実行

調査の結果、(1)のMDBファイルの更新が完了する前に、ActiveReportsを呼び出したために、タイミングにより、(3)でテーブルのデータを正常に取得できない場合があるようです。(3)の時点で、まだ(1)のMDBテーブル更新が確定されていないようです。
MDBのテーブルを確実にコミットする方法をご存知であればご教示ください。

以上
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-10-18 17:25
引用:

篇銀さんの書き込み (2006-10-18 17:13) より:
調査の結果、(1)のMDBファイルの更新が完了する前に、ActiveReportsを呼び出したために、タイミングにより、(3)でテーブルのデータを正常に取得できない場合があるようです。(3)の時点で、まだ(1)のMDBテーブル更新が確定されていないようです。
MDBのテーブルを確実にコミットする方法をご存知であればご教示ください。


最初の「連続してActiveReportsを呼び出すと」という記述と違ってきていますが、「連続して」というのは「delete/insertから連続して」という意味だったんでしょうか?(すごく微妙な表現だと思う・・)。

(1)の処理はどうやっているんでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-18 17:38
引用:

篇銀さんの書き込み (2006-10-18 17:13) より:

調査の結果、(1)のMDBファイルの更新が完了する前に、ActiveReportsを呼び出したために、タイミングにより、(3)でテーブルのデータを正常に取得できない場合があるようです。(3)の時点で、まだ(1)のMDBテーブル更新が確定されていないようです。
MDBのテーブルを確実にコミットする方法をご存知であればご教示ください。


トランザクション処理は、どのように実装しているのでしょうか?
真っ当な実装をしていれば、そのようなことは起きないハズです。

テンポラリ テーブルということはバウンド レポートですよね。
私ならば、テンポラリ テーブルなど使用せず、DataSource として DataSet を渡します。
DataSet であれば、今回のような問題が起こることはありませんし、高速です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
篇銀
常連さん
会議室デビュー日: 2005/06/01
投稿数: 26
投稿日時: 2006-10-18 18:03
shimixさん、こんにちは。
わかりずらい説明で申し訳ありません。
もう少し詳しく説明します。

処理の流れは以下の通りです。
(1) Formの上にタブコントロールがあり、そこに[印刷]ボタンを
配置しています。
MonthCalendarコントロールで日付を指定(期間指定)し、[印刷]
ボタンが押下されると、以下のメソッド(BTN_PRT_Click)が呼ばれ
ます。
CreateTBL1()では、TBL1以外のテーブルを操作し、ActiveReportsで使うテー
ブル(TBL1)にデータを追加しています。
※CreateTBL1()の処理の最初で、TBL1の全レコード削除しています。
Private Sub BTN_PRT_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTN_PRT.Click
Dim dtStart As DateTime
Dim dtEnd As DateTime
Dim nRet As Integer
Dim frmSeikyu2Dlg As frmSeikyu2

dtStart = DTP_PBSTARTDATE.Value()
dtEnd = DTP_PBENDDATE.Value()
nRet = CreateTBL1(dtStart, dtEnd)
If nRet <> 0 Then
MessageBox.Show()
Exit Sub
End If

frmSeikyu2Dlg = New frmSeikyu2()
frmSeikyu2Dlg.ShowDialog()
End Sub
(2) 新規ウィンドウで、印刷対象がプレビュー表示されます。
(3) 印刷対象のプレビューウィンドウを閉じます。
(4) 再度、Formの上にタブコントロール上の[印刷]ボタンを押下
します。

※上記の(1)〜(4)の操作を繰り返すと、期間が同じであれば同じ内容の
印刷対象が表示されるはずですが、表示される件数が少ない場合があり
ます。
※CreateTBL1()内でMDBファイル内にテンボラリテーブル(TBL1)にデータ追加し、ActiveReports側のモジュールで、そのテーブル(TBL1)をデータソースに設定しています。
※CreateTBL1()では、OleDbDataReaderを利用しておりまして、まずTBL1の全レコード削除は、
Private DbConnect As OleDbConnection
Private DbCommand As OleDbCommand

strSQL = "Delete from TBL1 "
DbCommand.Connection() = DbConnect
DbCommand.CommandText = strSQL
count = DbCommand.ExecuteNonQuery()

その後、複数のテーブルを操作し、TBL1にレコードを追加(Insert)します。

以上
篇銀
常連さん
会議室デビュー日: 2005/06/01
投稿数: 26
投稿日時: 2006-10-18 19:49
じゃんぬねっとさん、毎度お世話になります。
アドバイスをありがとうございます。
トランザクション処理に不備がありました。
下記のコードで、正常に動作するようになったようです。
しかし、ご指摘の通り処理速度に改善の余地があります。
ご教示頂いた方法を検討してみます。

Private DbConnect As OleDbConnection
Private DbCommand As OleDbCommand
Private DBTrans As OleDbTransaction

DBTrans = DbConnect.BeginTransaction()
DbCommand.Transaction = DBTrans
(処理)
DBTrans.Commit()

以上
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-18 20:03
引用:

篇銀さんの書き込み (2006-10-18 19:49) より:

トランザクション処理に不備がありました。
下記のコードで、正常に動作するようになったようです。


ADO.NET 関係のオブジェクトが Private メンバなのが、ちょっと気になりますね。
(本題と関係ないところですが)

引用:

しかし、ご指摘の通り処理速度に改善の余地があります。
ご教示頂いた方法を検討してみます。


レコードをテンポラリ テーブルに挿入する時間はカットできるでしょうが、
件数によっては、あまり効果が期待できないかもしれません。
ただし、保守性を考えると吉です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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