@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

【ASP.NET】連続するデータベースアクセス処理の記述方法

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-31 14:23
ASP.NET(VB.NET)で開発しています。

1画面に DataGrid と 金額集計表示用の Label が貼り付けてあります。
DataGrid の「追加」や「更新」ボタンが押された時に、それ相応(Insert や Update)の処理を行ない、最新の集計金額を検索(Select)し、表示するようにしています。

このような場合、SQL文を2回発行することになるのですが、記述方法に悩んでいます。どのような記述方法が良いのか教えていただけますでしょうか?

1.Try でくくる。

Try
   更新処理
   Try
      検索処理
   Finally
      後処理
   End Try
Finally
   後処理
End Try

2.別々の Try で記述。

Try
   更新処理
Finally
   後処理
End Try
Try
   検索処理
Finally
   後処理
End Try

3.もっと別の方法

理由も教えていただけると助かります。よろしくお願い致します。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-03-31 14:45
別々のファンクションあるいはプロシージャーでやるのが,よいのでは
理由は後から使いまわしや流用ができるからです。
なおかつ プログラムがわかり易いからです。


R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-31 14:53
僕も、味唐辛子さんと同じような意見ですが

コード:
    private void 更新ボタン_Click(object sender, EventArgs e) {
        if (!this.データの更新()) {
            this.データの更新エラーメッセージを表示();
            return;
        }
        if (!this.金額を読込む()) {
            this.金額の読込みエラーメッセージを表示();
            return;
        }
    }



このように書けるとわかりやすいですよね。
そうなると自ずと、別に分ける方が分かりやすいのだと思われます。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-31 15:03
七味唐辛子さん、お返事ありがとうございます。
引用:

七味唐辛子さんの書き込み (2006-03-31 14:45) より:

別々のファンクションあるいはプロシージャーでやるのが,よいのでは
理由は後から使いまわしや流用ができるからです。
なおかつ プログラムがわかり易いからです。


なるほど。私もその方法は考えたのですが、更新時(Update)に値をパラメータ渡しにしており、画面によってパラメータ数がバラバラになります。

パラメータ渡し方法
lo_Command.Parameters.Add("Koumoku", Oracle.DataAccess.Client.OracleDbType.Varchar2).Value = txtKoumoku.Text

これをどのように設計すれば良いのか分からなかったため、現状、上から下への古めかしい処理になってしまっています。

また、検索時には DataReader を使用しているのですが、Reader で取得した値をどのように返そうか(呼び先から呼び元へ)・・・ うん?! この場合は、ArrayList で返せばいけるかな。検索するテーブルの取得項目数が異なるのがネックだったのですが。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-03-31 15:10
引用:

ひろれいさんの書き込み (2006-03-31 15:03) より:
また、検索時には DataReader を使用しているのですが、Reader で取得した値をどのように返そうか(呼び先から呼び元へ)・・・ うん?! この場合は、ArrayList で返せばいけるかな。検索するテーブルの取得項目数が異なるのがネックだったのですが。


私ならDataAdapterを使用してDataTableで返しちゃいますが…
DataAdapterは使うな!というルールなのでしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-03-31 15:21
もいっこ。
私ならこうします。

Try
   接続
   更新
   検索
   コミット
Catch
   ロールバック
   Catchした例外を含むApplicationExceptionをThrow
Finally
   切断
End Try

理由は、1回の接続・切断ですむから。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-31 15:23
引用:

ぼのぼのさんの書き込み (2006-03-31 15:10) より:

私ならDataAdapterを使用してDataTableで返しちゃいますが…
DataAdapterは使うな!というルールなのでしょうか?


いいえ。そのようなルールは特にありません。私が DataAdapter や DataTable の使い方を知らないだけで(^_^;)
ありがとうございます。ちょっと調べてみます。

引用:

R・田中一郎さんの書き込み (2006-03-31 14:53) より:
僕も、味唐辛子さんと同じような意見ですが

コード:
    private void 更新ボタン_Click(object sender, EventArgs e) {
        if (!this.データの更新()) {
            this.データの更新エラーメッセージを表示();
            return;
        }
        if (!this.金額を読込む()) {
            this.金額の読込みエラーメッセージを表示();
            return;
        }
    }



このように書けるとわかりやすいですよね。
そうなると自ずと、別に分ける方が分かりやすいのだと思われます。


そうですね。私も更新処理と検索処理をファンクションに切り出した方がいいな、と考えております。

あとは、パラメータ渡しをどうするかなのですが何かしらの方法があるんですよね。
更新処理とパラメータを受け取る処理を分ければ出来そうですが、その場合、パラメータを受け取る処理が複数になってしまいますが、そういうのは設計上あり、なんでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-31 16:06
別スレでごちゃごちゃやっていたら、出遅れました。
using と try 〜 finally パターン + トランザクションで考えれば良いのでしょうか?

臨機応変ではありますが、連続が確定しているのであれば、

コード:

    using (コネクションの確立) {
        コネクション.Open();

        try {
            if (! this.更新()) {
                // TODO : しかるべきエラー処理;
                return;
            }

            if (! this.更新2()) {
                // TODO : しかるべきエラー処理;
                return;
            }

            // コミット
        } catch {
            // TODO : しかるべき例外処理 (たいてい、ここは続行不可能な例外)
            // ロールバック
        } finally {
            // Connection や Transaction などの破棄
            if (コネクション != null) {
                コネクション.Close();
            }
        }
    } // Disposed...


でしょうね。

場合によっては、更新メソッドでも例外機構をつけることがあります。
そのままスローな場合は何もしません。

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

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