- - PR -
ActiveReportsのSELECT文で取得したレコード数が不正
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 以上 | ||||||||
|
投稿日時: 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のテーブルを確実にコミットする方法をご存知であればご教示ください。 以上 | ||||||||
|
投稿日時: 2006-10-18 17:25
最初の「連続してActiveReportsを呼び出すと」という記述と違ってきていますが、「連続して」というのは「delete/insertから連続して」という意味だったんでしょうか?(すごく微妙な表現だと思う・・)。 (1)の処理はどうやっているんでしょうか? | ||||||||
|
投稿日時: 2006-10-18 17:38
トランザクション処理は、どのように実装しているのでしょうか? 真っ当な実装をしていれば、そのようなことは起きないハズです。 テンポラリ テーブルということはバウンド レポートですよね。 私ならば、テンポラリ テーブルなど使用せず、DataSource として DataSet を渡します。 DataSet であれば、今回のような問題が起こることはありませんし、高速です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 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)します。 以上 | ||||||||
|
投稿日時: 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() 以上 | ||||||||
|
投稿日時: 2006-10-18 20:03
ADO.NET 関係のオブジェクトが Private メンバなのが、ちょっと気になりますね。 (本題と関係ないところですが)
レコードをテンポラリ テーブルに挿入する時間はカットできるでしょうが、 件数によっては、あまり効果が期待できないかもしれません。 ただし、保守性を考えると吉です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1