- PR -

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

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-31 17:31
引用:

ひろれいさんの書き込み (2006-03-31 15:23) より:

あとは、パラメータ渡しをどうするかなのですが何かしらの方法があるんですよね。
更新処理とパラメータを受け取る処理を分ければ出来そうですが、その場合、パラメータを受け取る処理が複数になってしまいますが、そういうのは設計上あり、なんでしょうか?



僕が以前書いたコードは、こんな感じでした。

コード:
    private void 更新ボタン_Click(object sender, EventArgs e) {
        using (OleDbTransaction t = this.Db.Connection.BeginTransaction()) {
            using (OleDbRecordHandle r = this.RecordHandleCreate(t)) {
                this.レコード = r;
                if (!this.データの更新()) {
                    this.データの更新エラーメッセージを表示();
                    t.Rollback();
                    return false;
                }
                if (!this.金額を読込む()) {
                    this.金額の読込みエラーメッセージを表示();
                    t.Rollback();
                    return false;
                }
                t.Commit();
                return true;
            }
        }
    }


ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-31 18:17
R・田中一郎さん、じゃんぬさん、こんばんは。
一気にお返事をいただきましたので、パニクリながら調べておりました(^_^;)
引用:

じゃんぬねっとさんの書き込み (2006-03-31 16:06) より:

別スレでごちゃごちゃやっていたら、出遅れました。
using と try 〜 finally パターン + トランザクションで考えれば良いのでしょうか?


お忙しい中、ありがとうございます(^o^)
出来れば、VB.NET で記述いただけると私の中のコンパイラがスンナリ翻訳できますので(^_^;)

引用:

R・田中一郎さんの書き込み (2006-03-31 17:31) より:

僕が以前書いたコードは、こんな感じでした。

コード:
    private void 更新ボタン_Click(object sender, EventArgs e) {
        using (OleDbTransaction t = this.Db.Connection.BeginTransaction()) {
            using (OleDbRecordHandle r = this.RecordHandleCreate(t)) {
                this.レコード = r;
                if (!this.データの更新()) {
                    this.データの更新エラーメッセージを表示();
                    t.Rollback();
                    return false;
                }
                if (!this.金額を読込む()) {
                    this.金額の読込みエラーメッセージを表示();
                    t.Rollback();
                    return false;
                }
                t.Commit();
                return true;
            }
        }
    }




みなさんのご意見をまとめると、

1.更新処理や検索処理は、ファンクション等に外出しした方が良い。
2.1接続、1トランザクションで処理するようにした方が良い。

という感じでしょうか。
やはり、イベント内に直でDBアクセスするよりは、極力部品化する道を模索しましょう、ってことですね。頑張ります・・・

イメージとしては、
コード:
Public Class DBAccess
   Public Function やりたい処理1() As 返り値
      Try
         接続()
         更新処理1()
         更新処理2()
         検索()
         Commit
         Return 検索結果
      Catch ex As Exception
         Rollback
         Throw
      Finally
         後処理
      End Try
   End Function

   Private Sub 接続()
      接続
   End Sub

   Private Sub 更新処理1()
      更新
   End Sub

   Private Sub 更新処理2()
      更新
   End Sub

   Private Function 検索() As 返り値
      検索
      Return 検索結果
   End Function
End Class


という感じでしょうか。
更新するデータ(画面から入力された値)をクラスに渡すには、やはり引数として渡すべきですよね?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-03-31 19:48
引用:

ひろれいさんの書き込み (2006-03-31 18:17) より:
更新するデータ(画面から入力された値)をクラスに渡すには、やはり引数として渡すべきですよね?


Shared Functionならそうですけど、インスタンスありきなら、コンストラクタの引数やプロパティとして渡すのもありじゃないですか?
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-01 09:03
引用:

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

Shared Functionならそうですけど、インスタンスありきなら、コンストラクタの引数やプロパティとして渡すのもありじゃないですか?


プロパティですか。なるほど。だんだんクラスっぽくなっていきますね(^_^;)
コンストラクタの調査と共に検討してみたいと思います。
ありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-01 09:33
DBAccess というクラス名でありながら、
やりたい処理メソッド、更新処理メソッド、検索メソッドがあるんですね。

そこまでやるのであれば、データベース中心ではなくデータ中心のクラスになるでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-01 09:46
引用:

じゃんぬねっとさんの書き込み (2006-04-01 09:33) より:
DBAccess というクラス名でありながら、
やりたい処理メソッド、更新処理メソッド、検索メソッドがあるんですね。

そこまでやるのであれば、データベース中心ではなくデータ中心のクラスになるでしょうね。



僕もそう思います(^^;
何故、DBAccess でやるよりもスレ元の投稿にあるところの、グリッドの値が変更され
た部分に対して、どのようにデータ処理を行うのかを考えるほうが分かりやすいよう
に思います。

最初の投稿では、Try 〜 Catch 〜 Finally の括り方で悩んでいたと思うのです。
僕の返答では、データの更新(), 金額を読込む() の各メソッドの中に、それぞれ
Try 〜 Catch 〜 Finally を含めて、処理の成功と失敗を返すようにしたら良いんじ
ゃないか、と言いたかったのです。

わかりにくくて申し訳なかったです(--
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-01 10:47
引用:

じゃんぬねっとさんの書き込み (2006-04-01 09:33) より:

DBAccess というクラス名でありながら、
やりたい処理メソッド、更新処理メソッド、検索メソッドがあるんですね。

そこまでやるのであれば、データベース中心ではなくデータ中心のクラスになるでしょうね。


引用:

R・田中一郎さんの書き込み (2006-04-01 09:46) より:

僕もそう思います(^^;
何故、DBAccess でやるよりもスレ元の投稿にあるところの、グリッドの値が変更され
た部分に対して、どのようにデータ処理を行うのかを考えるほうが分かりやすいよう
に思います。

最初の投稿では、Try 〜 Catch 〜 Finally の括り方で悩んでいたと思うのです。
僕の返答では、データの更新(), 金額を読込む() の各メソッドの中に、それぞれ
Try 〜 Catch 〜 Finally を含めて、処理の成功と失敗を返すようにしたら良いんじ
ゃないか、と言いたかったのです。

わかりにくくて申し訳なかったです(--:wink:


じゃんぬさん、R・田中一郎さん、こんにちは。
はい。すいません。混乱しておりました(^_^;)

「とりあえず動く形を」ということでイベント内に処理を実装しました。
で、見てみると、どうも(Try の)階層が深いので、「普通はこういう書き方するのかな」と疑問に思いましたので、本スレの質問をさせていただきました。

で、みなさんのご意見を伺うと「クラスの利用」が一般的そうなので、クラスを利用する方法を自分なりに考えてみたわけです。

その結果が、お二人の言われた DBAccess クラス内に「やりたい処理」と「DBアクセス処理」が混在するというお粗末な解答でした・・・
で、本日、実装してみたのですが、私自身もおかしいことに気付き(笑)、テーブル単位にクラスをすることにしました。

<Try は省きますね>
Public Class Table1_Access
   Public Function Upd_Table1() As DataSet
      接続
      BeginTransaction()
      更新1
      更新2
      検索
      Commit()
   End Function

   Public Sub Del_Table1() As DataSet
      接続
      BeginTransaction()
      削除
      検索
      Commit()
   End Function

   Public Sub Insert_Table1() As DataSet
      接続
      BeginTransaction()
      追加
      検索
      Commit()
   End Function
End Class

で、イベント内からは引数渡しで各メソッドを呼ぶようにしました。
とりあえず、1テーブル修正してみましたが、かなりスッキリしました。

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