none
データをUPDATE する記述(どちらが王道ですか?) RRS feed

  • 質問

  • いつもお世話になっております。
    データを登録(UPDATE)する記述が参考書によってそれぞれ違います。

    以下、その例を記載いたします(UPDATE処理以外の記述は端折っています)

    ----------------------------------

    参考書A

        Private objshizaiSQLDataSet As New shizaiSQLDataSet()
        Private objM_UserTableAdapter As New shizaiSQLDataSetTableAdapters.M_UserTableAdapter()
        Private objM_UserLevelTableadapter As New shizaiSQLDataSetTableAdapters.M_UserLevelTableAdapter()

        Private objTableAdapterManager As New shizaiSQLDataSetTableAdapters.TableAdapterManager()

            Try
                Dim objDataRow As DataRow = objshizaiSQLDataSet.M_User.NewRow()

                With objDataRow
                    .Item("chk") = chkONOFF.Checked
                    .Item("UserID") = txtUserID.Text
                    .Item("UserName") = txtUserName.Text
                    .Item("password") = txtNewPassword1.Text
                    .Item("UserLevelID") = cmbUserLevel.SelectedIndex + 1
                End With

                objshizaiSQLDataSet.M_User.Rows.Add(objDataRow)
                objTableAdapterManager.UpdateAll(objshizaiSQLDataSet)

                MessageBox.Show("登録処理は正常に行われました。", "登録処理", _
                                MessageBoxButtons.OK, MessageBoxIcon.Information)

            Catch ex As Exception

                MessageBox.Show("エラーが発生しました。" & vbCrLf & "システム管理者をコールして下さい。" _
                                & vbCrLf & vbCrLf & ex.Message, "登録処理エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

    ----------------------------------

    参考書B

            Try
                Dim objDataRow As shizaiSQLDataSet.M_UserRow =
                    Me.objshizaiSQLDataSet.M_User.NewM_UserRow()

                With objDataRow
                    .chk = chkONOFF.Checked
                    .UserID = txtUserID.Text
                    .UserName = txtUserName.Text
                    .Password = txtNewPassword1.Text
                    .UserLevelID = cmbUserLevel.SelectedIndex + 1
                End With

                Me.objshizaiSQLDataSet.M_User.AddM_UserRow(objDataRow)
                Me.objTableAdapterManager.UpdateAll(objshizaiSQLDataSet)

                MessageBox.Show("登録処理は正常に行われました。", "登録処理", _
                                MessageBoxButtons.OK, MessageBoxIcon.Information)

            Catch ex As Exception

                MessageBox.Show("エラーが発生しました。" & vbCrLf & "システム管理者をコールして下さい。" _
                                & vbCrLf & vbCrLf & ex.Message, "登録処理エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

    ----------------------------------

    どちらもデータベースへデータをUPDATE出来るようですが、どちらの記述の仕方が
    王道と言うか一般的なのか、ご教示いただければ幸いです。
    VBは目的は同じでも様々な記述方法がたくさんあり、私のような初心者は戸惑ってしまいます(T_T)

    よろしくお願い申し上げます。

    2012年6月30日 7:17

回答

  • どちらが一般的かは気にしなくていいでしょう。
    それよりもコードのしやすさや堅牢性、実行速度で検討すれば良いと思います。

    > .Item("UserID") = txtUserID.Text
    フィールド名を文字列で指定するこの書き方だとフィールド名文字列を間違えていてもコンパイルが通ってしまいます。エラーになるのは実行時です。
    また、文字列以外の値も代入できてしまいます。これもエラーになるのは実行時です。

    > .UserID = txtUserID.Text
    こちらは IDE やコンパイラによって型チェックされるので上記の問題は発生しません。
    プロパティを作成するのは少し面倒ですが、すでに自動生成されているプロパティを使用しない理由はあまりありません。

    2012年6月30日 8:59
  • 参考書Aと参考書Bの違いは、型付DataRowを使用しているか、していないかの違いです。参考書Bは型付DataRowを使用していますが、参考書Aは型なしDataRow使用しています。
    型付DataRowとは、DataRowを継承し、プロパティやメソッドを追加して便利に使えるようにしたクラスです。ですから、chk, UserID , UserNameなどのプロパティが追加されています。
    型付DataRowは、Visual Studioでデータセットをウィザードにしたがって作成する際に、同時に作成されます。この時、TableAdapter、型付DataSet、型付DataTableなども同時に作成されます。
    このように、便利な型付DataRowをせっかくVisual Studioが作ってくれているのですから、一般的にはそれを使用します。
    例えるなら、箸でカレーライスを食べることは可能ですが、せっかくスプーンが用意されているのならスプーンを使って食べた方が食べやすいということです。箸が型なしDataRowであり、スプーンが型付DataRowです。

    (参考)
    方法 : DataTable に行を追加する
    http://msdn.microsoft.com/ja-jp/library/5ycd1034(v=vs.90).aspx

    一般的には型付データセットとして解説されていることが多いので、さらに勉強を進められる際には、「型付データセット」をキーワードとして調べてみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年7月2日 0:42
    モデレータ
  • 私は galaco さんの意見に近いです。どちらが王道・一般的かという認識はないと考えてますし、仕様次第だと思います。また型付データセットのメリットに関しては、お二人の仰られているとおりです。

    ただし型付データセットのデメリットを強いて挙げれば、スキーマの変更に弱いところでしょうか。
    実は私も前の案件でウィザードを使い型付データセットを生成して開発していたのですが、
    仕様変更が激しくスキーマの変更も頻繁に発生し、今後もフィールドの追加があり得ることから、
    あえて型付データセットから通常のデータセットに移行しました。

    galaco さんのおっしゃる通り堅牢性の問題がありますが、テストを充分に行っていれば実行時エラーは回避できると思います。

    #まあこういう事例もあるということで・・・


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 2:13
    モデレータ
  • 追記です。あと一点問題あったことを思い出しました。

    私の場合、RDBMS に MySQL を使っていたため、IDE の支援を十分に受けられなかったというのも大きいです。
    SQLServer なら特に問題ないでしょうが、RDBMS に何を使うかも判断基準になると思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 2:20
    モデレータ
  • 仕様変更が激しくスキーマの変更も頻繁に発生し、今後もフィールドの追加があり得ることから、
    あえて型付データセットから通常のデータセットに移行しました。

    開発工数やポリシーなどいろいろな条件がありますから、絶対に型付データセットを使用すべきだとは思いませんが、できるだけ使うべきだと思います。私は型付データセットでなければ、むしろ怖くてスキーマの変更をしづらく感じます。どこで実行時エラーが出るかわからないからです。(テーブルに列を追加するだけならほとんど問題ないですが)
    でも、MySQLなどのようにIDEの支援が受けられないと確かにつらいですね・・・。SQL Serverだとテーブルアダプターを右クリックして、「構成...」でウィザードをやり直すだけであっと言う間に終わってしまいますから。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年7月2日 3:02
    モデレータ
  • でも、MySQLなどのようにIDEの支援が受けられないと確かにつらいですね・・・。SQL Serverだとテーブルアダプターを右クリックして、「構成...」でウィザードをやり直すだけであっと言う間に終わってしまいますから。

    そうですね。MySQL/Connector.NET を使っていたため IDE の支援がまったく受けられないというわけではないのですが、スキーマの修正はかなり厳しかったです。(In32がなぜか全てLong になってしまったりetc・・・)

    #最新バージョンのウィザード対応状況は判りません。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 3:28
    モデレータ
  • A:型無データセット と B:型付データセット ですね。

    こんな認識で良いのでしょうか。

    A の方が基本型で 、B は IDE で自動生成しコーディングを減らす目的で追加導入されたもの。

    型付データセットの利点は、元のデータベースのスキーマを受け継いでいるため、エラー処理が少なくて済むこと。

    様々なコードが自動生成されていて、基本的には隠蔽されており詳細を気にしなくて済むこと。

    欠点は、スキーマの変更に対して、あまり親切ではないこと。

    個々のコードを訂正して変更は可能でしょうが、余程知識がないとちゃんと動かなくなりますので、もう一度 IDE で作り直すことになります。

    自前で、様々な例外処理を書き込むなら、A。

    コーディングを楽にしたいなら、B.

    注意点は、どちらかのみでコーディングを統一す事でしょう。 Bug の元になりかねませんから。

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 5:02
  • 私が先に書いた例があまり良くなく、ここまでの流れもkei_chan_gtさんに誤解を与えそうだと感じたので補足しておきます。

    型付は形無しを継承して作成されますから、型付は形無しができることは全てできます。私が先に書いた箸やスプーンのように、全く別のものではありません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 6:14
    モデレータ
  • trapemiya さま 最初のご説明、特に箸とスプーンの例えは、個人的にはとても良かったと思います。

    確かに別物ではないけれど、それ位違うと思っていたほうが良いと思います。

    色々なサンプルからコードを持ってきてプロジェクトを作り上げると、箸とスプーンとを両手に持つ様な事になり兼ねませんから。

    サンプルを探すときは、それがどちらのデータセットなのか意識することが大事だと思います。

     

    それから、kei_chan_gt さま 型付データセットの留意点をひとつ。

    接続文字列が IDE によって、プロジェクトの設定項目の中に自動設定されますので、別プロジェクトにデータセットや Adapter をコピーするとエラーを起こします。

      Global.<プロジェクト名>.My.MySettings.Default.XXXXConnectionString(接続名)         ReadOnlyProperty

    2012年7月2日 9:07
  • kei_chan_gt さま その後いかがですか。

    スパゲッティ状態とありますが、私なんか、伸びたそば状態でズタズタです。(脱線 ... )

    理由は、MSがベーシックを大事に育てているためで、機能が拡張され便利になる一方で、

    入門者(私も)には分かりずらいコマンド体系(複数の手段が混在)になっているからでしょう。

    参考書もホームページの検索も良いですが、純正のヘルプファイルやドキュメント、

    それから IDE の F2 Key で表示されるオブジェクトブラウザを読み込まれることをお勧めします。

    そう、VB の 'ガイドツアー' も良かったです。  (私の環境は VB2008EE SP1)

     

    'New' については インスタンス や クラス (オブジェクト指向) を調べると良いでしょう。

    実際にサンプルとして、ご自分でクラスを作って見るのがお勧めです。 良くわかるようになります。

    '△△(of □□) ' や '.Tolist' , 'ToArray' はコレクション (System.Collections 名前空間) の派生です。

    それぞれ特徴の違う、データ群をひとかたまりで扱うための、データそのものや機能(メソッド)です。

    'コレクションとは' で検索すると色々な言語で使われているので、様々な説明を読めます。

    • 編集済み ShiroYuki_Mot 2012年7月3日 13:02 環境追加
    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月3日 9:51
  • kei_chan_gt さん、こんにちは。
    投稿して頂いた皆様の意見が参考になったと思われますので、勝手ながら私の方で回答マークを付けさせて頂きます。
     
    問題の解決に参考になった投稿には、質問者が回答マークを付けることができます。また後からマークを外すことも可能です。今後他の方が本スレッドを閲覧した際、参考のためにも、ぜひ回答をマークして頂けると有難く思います。

    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:42
    2012年7月4日 1:28
    モデレータ

すべての返信

  • どちらが一般的かは気にしなくていいでしょう。
    それよりもコードのしやすさや堅牢性、実行速度で検討すれば良いと思います。

    > .Item("UserID") = txtUserID.Text
    フィールド名を文字列で指定するこの書き方だとフィールド名文字列を間違えていてもコンパイルが通ってしまいます。エラーになるのは実行時です。
    また、文字列以外の値も代入できてしまいます。これもエラーになるのは実行時です。

    > .UserID = txtUserID.Text
    こちらは IDE やコンパイラによって型チェックされるので上記の問題は発生しません。
    プロパティを作成するのは少し面倒ですが、すでに自動生成されているプロパティを使用しない理由はあまりありません。

    2012年6月30日 8:59
  • 参考書Aと参考書Bの違いは、型付DataRowを使用しているか、していないかの違いです。参考書Bは型付DataRowを使用していますが、参考書Aは型なしDataRow使用しています。
    型付DataRowとは、DataRowを継承し、プロパティやメソッドを追加して便利に使えるようにしたクラスです。ですから、chk, UserID , UserNameなどのプロパティが追加されています。
    型付DataRowは、Visual Studioでデータセットをウィザードにしたがって作成する際に、同時に作成されます。この時、TableAdapter、型付DataSet、型付DataTableなども同時に作成されます。
    このように、便利な型付DataRowをせっかくVisual Studioが作ってくれているのですから、一般的にはそれを使用します。
    例えるなら、箸でカレーライスを食べることは可能ですが、せっかくスプーンが用意されているのならスプーンを使って食べた方が食べやすいということです。箸が型なしDataRowであり、スプーンが型付DataRowです。

    (参考)
    方法 : DataTable に行を追加する
    http://msdn.microsoft.com/ja-jp/library/5ycd1034(v=vs.90).aspx

    一般的には型付データセットとして解説されていることが多いので、さらに勉強を進められる際には、「型付データセット」をキーワードとして調べてみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年7月2日 0:42
    モデレータ
  • 私は galaco さんの意見に近いです。どちらが王道・一般的かという認識はないと考えてますし、仕様次第だと思います。また型付データセットのメリットに関しては、お二人の仰られているとおりです。

    ただし型付データセットのデメリットを強いて挙げれば、スキーマの変更に弱いところでしょうか。
    実は私も前の案件でウィザードを使い型付データセットを生成して開発していたのですが、
    仕様変更が激しくスキーマの変更も頻繁に発生し、今後もフィールドの追加があり得ることから、
    あえて型付データセットから通常のデータセットに移行しました。

    galaco さんのおっしゃる通り堅牢性の問題がありますが、テストを充分に行っていれば実行時エラーは回避できると思います。

    #まあこういう事例もあるということで・・・


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 2:13
    モデレータ
  • 追記です。あと一点問題あったことを思い出しました。

    私の場合、RDBMS に MySQL を使っていたため、IDE の支援を十分に受けられなかったというのも大きいです。
    SQLServer なら特に問題ないでしょうが、RDBMS に何を使うかも判断基準になると思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 2:20
    モデレータ
  • 仕様変更が激しくスキーマの変更も頻繁に発生し、今後もフィールドの追加があり得ることから、
    あえて型付データセットから通常のデータセットに移行しました。

    開発工数やポリシーなどいろいろな条件がありますから、絶対に型付データセットを使用すべきだとは思いませんが、できるだけ使うべきだと思います。私は型付データセットでなければ、むしろ怖くてスキーマの変更をしづらく感じます。どこで実行時エラーが出るかわからないからです。(テーブルに列を追加するだけならほとんど問題ないですが)
    でも、MySQLなどのようにIDEの支援が受けられないと確かにつらいですね・・・。SQL Serverだとテーブルアダプターを右クリックして、「構成...」でウィザードをやり直すだけであっと言う間に終わってしまいますから。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年7月2日 3:02
    モデレータ
  • でも、MySQLなどのようにIDEの支援が受けられないと確かにつらいですね・・・。SQL Serverだとテーブルアダプターを右クリックして、「構成...」でウィザードをやり直すだけであっと言う間に終わってしまいますから。

    そうですね。MySQL/Connector.NET を使っていたため IDE の支援がまったく受けられないというわけではないのですが、スキーマの修正はかなり厳しかったです。(In32がなぜか全てLong になってしまったりetc・・・)

    #最新バージョンのウィザード対応状況は判りません。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 3:28
    モデレータ
  • A:型無データセット と B:型付データセット ですね。

    こんな認識で良いのでしょうか。

    A の方が基本型で 、B は IDE で自動生成しコーディングを減らす目的で追加導入されたもの。

    型付データセットの利点は、元のデータベースのスキーマを受け継いでいるため、エラー処理が少なくて済むこと。

    様々なコードが自動生成されていて、基本的には隠蔽されており詳細を気にしなくて済むこと。

    欠点は、スキーマの変更に対して、あまり親切ではないこと。

    個々のコードを訂正して変更は可能でしょうが、余程知識がないとちゃんと動かなくなりますので、もう一度 IDE で作り直すことになります。

    自前で、様々な例外処理を書き込むなら、A。

    コーディングを楽にしたいなら、B.

    注意点は、どちらかのみでコーディングを統一す事でしょう。 Bug の元になりかねませんから。

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 5:02
  • 私が先に書いた例があまり良くなく、ここまでの流れもkei_chan_gtさんに誤解を与えそうだと感じたので補足しておきます。

    型付は形無しを継承して作成されますから、型付は形無しができることは全てできます。私が先に書いた箸やスプーンのように、全く別のものではありません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月2日 6:14
    モデレータ
  • trapemiya さま 最初のご説明、特に箸とスプーンの例えは、個人的にはとても良かったと思います。

    確かに別物ではないけれど、それ位違うと思っていたほうが良いと思います。

    色々なサンプルからコードを持ってきてプロジェクトを作り上げると、箸とスプーンとを両手に持つ様な事になり兼ねませんから。

    サンプルを探すときは、それがどちらのデータセットなのか意識することが大事だと思います。

     

    それから、kei_chan_gt さま 型付データセットの留意点をひとつ。

    接続文字列が IDE によって、プロジェクトの設定項目の中に自動設定されますので、別プロジェクトにデータセットや Adapter をコピーするとエラーを起こします。

      Global.<プロジェクト名>.My.MySettings.Default.XXXXConnectionString(接続名)         ReadOnlyProperty

    2012年7月2日 9:07
  • みなさま、ご解説ありがとうございます。

    本によっては型付を意識して解説してくれる本
    はたまた、まったくそれらに触れていない本

    と、さまざまあり、頭の中がスパゲッティ状態でした。
    みなさまのアドバイスが非常に参考になりました。

    深く感謝申し上げます。
    また、これ以外にも、

    どんな時にNewをつければいいのか?
    (なぜ、SqlDataReader を宣言するときは、なぜNewを付けないのか)

    Private ○○ as New △△ (of □□)
    (of □□ って何を意味しているの?)

    ○○.ToArray と ○○.ToList の違いは?

    DataRow と DataRowView の違いは?
    (どんな場面で使い分けるの?)

    などわからない問題が山積しておりますが、がんばって参考書を片手に
    ひとつづつ習得していきたいと思います。

    どうかまたご指導の程よろしくお願い申し上げます。
    みなさま、ありがとうございました。

    2012年7月3日 6:05
  • kei_chan_gt さま その後いかがですか。

    スパゲッティ状態とありますが、私なんか、伸びたそば状態でズタズタです。(脱線 ... )

    理由は、MSがベーシックを大事に育てているためで、機能が拡張され便利になる一方で、

    入門者(私も)には分かりずらいコマンド体系(複数の手段が混在)になっているからでしょう。

    参考書もホームページの検索も良いですが、純正のヘルプファイルやドキュメント、

    それから IDE の F2 Key で表示されるオブジェクトブラウザを読み込まれることをお勧めします。

    そう、VB の 'ガイドツアー' も良かったです。  (私の環境は VB2008EE SP1)

     

    'New' については インスタンス や クラス (オブジェクト指向) を調べると良いでしょう。

    実際にサンプルとして、ご自分でクラスを作って見るのがお勧めです。 良くわかるようになります。

    '△△(of □□) ' や '.Tolist' , 'ToArray' はコレクション (System.Collections 名前空間) の派生です。

    それぞれ特徴の違う、データ群をひとかたまりで扱うための、データそのものや機能(メソッド)です。

    'コレクションとは' で検索すると色々な言語で使われているので、様々な説明を読めます。

    • 編集済み ShiroYuki_Mot 2012年7月3日 13:02 環境追加
    • 回答としてマーク kei_chan_gt 2012年7月6日 3:41
    2012年7月3日 9:51
  • kei_chan_gt さん、こんにちは。
    投稿して頂いた皆様の意見が参考になったと思われますので、勝手ながら私の方で回答マークを付けさせて頂きます。
     
    問題の解決に参考になった投稿には、質問者が回答マークを付けることができます。また後からマークを外すことも可能です。今後他の方が本スレッドを閲覧した際、参考のためにも、ぜひ回答をマークして頂けると有難く思います。

    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年7月6日 3:42
    2012年7月4日 1:28
    モデレータ
  • ひらぽんさま、みなさま

    マークを付け忘れてしまい、大変に失礼を致しました<(_)>

    ちなみに形無しで解説している参考書は、
     日経BP社の「ひと目でわかるVisual Basic2010 データベース開発入門」で、

    型付で解説してある参考書は、
     秀和システム社の「Visual Basic で学ぶ ADO.NET3.5 データベースプログラミング」でした。

    ShiroYuki_Mot さま、追加のご教示ありがとうございました。

    みなさま今後ともどうかよろしくお願い申し上げます。

    2012年7月6日 3:40