トップ回答者
DataSetの使用について

質問
-
こんばんは。以下の質問の続きにあたります。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1234535&SiteID=7
いろいろ調べた結果、まず簡単に以下ようなのクラスを作成しました。
'患者データ取得用クラス
Public Class cls_PtDataAccess
Private Cn As SqlConnection
Private cmd As SqlCommandPublic Sub New()
Cn = New SqlConnection(My.MySettings.Default.Con)
cmd = New SqlCommand
cmd.Connection = Cn
End Sub'選択した患者データを取得
Public Function GetSelectPtData(ByVal parPtCode As String) As DataSet
Dim retDs As New DataSetTry
'コマンドパラメータのクリア
cmd.Parameters.Clear()'コマンドの設定
With cmd
.CommandText = "sp_disp_ptdata"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@ptcode", SqlDbType.VarChar).Value = parPtCode.ToString
End With'テーブルからレコード取得
Dim Da As New SqlDataAdapter
Da.SelectCommand = cmd
Da.Fill(retDs)Catch ex As Exception
MsgBox("エラー")
End Try'リターン
Return retDsEnd Function
End Class今回は、サンプルなどを見ながら記述をしたためこのようになっていますが、SqlDataAdapterなどは、Public Sub New()の中の記述をしてしまっても問題ないのでしょうか。
また、データの更新をこのクラス内に加えておくべきなのでしょうか。
もうひとつなのですが、今回のようにある特定のフォーム内の記述したクラスはそのフォームが閉じているときは、呼び出すことはできないのでしょうか。別のフォームから、
Dim PtData as New cls_PtDataAccess
とやっても、cls_PtDataAccessに下線がつき、エラーとなっています。この場合は、項目の追加の中にある、「クラス」というものを使うことになるのでしょうか。
最後なのですが、Mapping(この呼び方でいいのかわからないのですが)を行うと、テーブルのフィールド名がコードの記述の選択の中に現れたりして、記述が楽になったり、動作もかなり早くなるというものを目にしたのですが、このような記述はどこに書くべきなのでしょうか。
わからないことばかりで申し訳ありませんが、どうかよろしくお願いします。
回答
-
いろいろと詳しい説明をありがとうございます。
今まで頂いたアドバイスをもとに、今一度自分なりにがんばってみたいと思います。
(TableAdapterについてももう一度、一から勉強してみます。)trapemiya さんからの引用 データベースですか? SQL serverの中にデータベースやテーブルを作成する場合は、私はコードで行っています。Word文書でテーブルを設計して、そこからCreate Tableなどのコードを自動生成するツール(自作)を使っています。こうしておくとテーブルの仕様書も自動的に残るので、後々便利です。 なるほど。Accessで作業をしているときから、自分だけが使用するものにしても仕様書のことでいつも頭を悩ましていたのですが、そのような方法もあるのですね。(といってもどのようにやっているか現時点での私には皆目見当がつかないのですが。)
非常に興味があることなので、自分でも調べてみたいと思います。
本当にありがとうございました。
すべての返信
-
TI-cb400s さん、こんにちは。
TI-cb400s さんからの引用 今回は、サンプルなどを見ながら記述をしたためこのようになっていますが、SqlDataAdapterなどは、Public Sub New()の中の記述をしてしまっても問題ないのでしょうか。 私は Open メソッドや、各メソッドで実行 直前に 開かれている方が好きですね。
また、データの更新をこのクラス内に加えておくべきなのでしょうか。 データ クラスなのであれば、加えておいて良いと思います。
もうひとつなのですが、今回のようにある特定のフォーム内の記述したクラスはそのフォームが閉じているときは、呼び出すことはできないのでしょうか。 インスタンス メンバは、インスタンス化さえしてあれば、呼び出せます。
フォームが表示されているかどうかは関係ありません。というより、なぜ特定のフォームに記述してしまっているのでしょうか?
せっかくデータとして分離できているのですから、分けてしまうべきです。 -
TI-cb400s さんからの引用
今回は、サンプルなどを見ながら記述をしたためこのようになっていますが、SqlDataAdapterなどは、Public Sub New()の中の記述をしてしまっても問題ないのでしょうか。
問題ありません。ツールボックスからSqlDataAdapterをフォームに貼り付けた場合、このような形でコードが生成されます。TI-cb400s さんからの引用
また、データの更新をこのクラス内に加えておくべきなのでしょうか。
というよりも、どのような目的でこのクラスを設計したかによります。が、一般的にはデータ更新が必要であれば、このクラスに追加するのが自然でしょう。TI-cb400s さんからの引用
cls_PtDataAccessに下線がつき、エラーとなっています。
名前空間が違っていませんか?TI-cb400s さんからの引用
最後なのですが、Mapping(この呼び方でいいのかわからないのですが)を行うと、テーブルのフィールド名がコードの記述の選択の中に現れたりして、記述が楽になったり、動作もかなり早くなるというものを目にしたのですが、このような記述はどこに書くべきなのでしょうか。
厳密に型指定されたデータセット(単に型付データセットとも言います)のことだと思います。
これは、特定の目的用のデータセットを便利に扱えるように、クラスとしてそれをラップしたものです。コードで書くのはちょっとやっかいだったと思いますので、通常はデザイナのウィザードで生成します。このウィザードで生成されたコードを参考にされてみれば勉強になると思います。ところで一つ確認をさせて下さい。cls_PtDataAccessのような目的のためにTableAdapterというものが存在しますが、それはあえて利用されずに、勉強としてご自分でTableAdapterのようなクラスを書かれているということで宜しいでしょうか?
-
trapemiya さんからの引用 TI-cb400s さんからの引用
cls_PtDataAccessに下線がつき、エラーとなっています。
名前空間が違っていませんか?確認はしてあったので、大丈夫だと思うのですが、もう一度確認をしてみます。
trapemiya さんからの引用 ところで一つ確認をさせて下さい。cls_PtDataAccessのような目的のためにTableAdapterというものが存在しますが、それはあえて利用されずに、勉強としてご自分でTableAdapterのようなクラスを書かれているということで宜しいでしょうか?
はい。以前はデータソースウィザードを使用していろいろと試していたのですが、変更・削除などを行ううちに良く分からなくなってしまったため、勉強の為コードで記述する方法を取っています。
しかし、やはりコードを記述する方法はなかなか大変なので、ウィザードを使用する方法も並行して勉強しなおしたいと思います。
逆に質問なのですが、皆様はデータベースなどを作成する際は、ウィザードを使用しているのでしょうか。もうひとつあるのですが、TableAdapterを使用する場合にデータセットの状態により、UpdateやInsertを判断して実行するとのことなのですが、何の変更もない場合にもInsertを実行したい場合などは、どのように行えばよいのでしょうか。(もともとの質問の始まりである、予約・実績情報の管理において、変更・追加もあるのですが、予定通りの場合はまったく予約情報を変更することなく、実績管理用のテーブルへデータを追加したいので。)いろいろと調べているのですが、どうにも分かりませんでした。
どうか、よろしくお願いします。
-
TI-cb400s さんからの引用
確認はしてあったので、大丈夫だと思うのですが、もう一度確認をしてみます。
書き忘れましたが、いろんなフォーム(クラス)からcls_PtDataAccessを使われるのであれば、おっしゃる通り、ソリューションエクスプローラからプロジェクトを右クリックして追加でクラスを選び、そこに書かれた方が良いでしょう。
もちろん、フォームと同じ.vbファイルに記述されても動きますが、コードの見通しとしては悪いでしょう。TI-cb400s さんからの引用
はい。以前はデータソースウィザードを使用していろいろと試していたのですが、変更・削除などを行ううちに良く分からなくなってしまったため、勉強の為コードで記述する方法を取っています。
了解です。TI-cb400s さんからの引用
逆に質問なのですが、皆様はデータベースなどを作成する際は、ウィザードを使用しているのでしょうか。
データベースですか? SQL serverの中にデータベースやテーブルを作成する場合は、私はコードで行っています。Word文書でテーブルを設計して、そこからCreate Tableなどのコードを自動生成するツール(自作)を使っています。こうしておくとテーブルの仕様書も自動的に残るので、後々便利です。データセットの場合は、場合によります。型付データセットならウィザード以外は考えられません。型付でなければ、ウィザードは使わないことが多いです。ただ、ツールボックスから貼り付ける場合はウィザードを使います。といいますか、この場合は必ずウィザードが開きますので(^^;
TI-cb400s さんからの引用
もうひとつあるのですが、TableAdapterを使用する場合にデータセットの状態により、UpdateやInsertを判断して実行するとのことなのですが、何の変更もない場合にもInsertを実行したい場合などは、どのように行えばよいのでしょうか。
例えばDataGridViewにデータテーブルがバインドされているとします。DataGridViewで新規行の入力を行えば、データテーブルにも新規行というマークが付いて行が作成されます。この状態で、TableAdapter.Updateを行えば、この新規行をデータベースに保存するInsert文が自動で実行されます。
ユーザー入力ではなく、コードでデータを追加したい場合には、データテーブルに直接追加して、TableAdapter.Updateを実行したり、データベースに直接Insert文を発行して追加することになるでしょう。 -
いろいろと詳しい説明をありがとうございます。
今まで頂いたアドバイスをもとに、今一度自分なりにがんばってみたいと思います。
(TableAdapterについてももう一度、一から勉強してみます。)trapemiya さんからの引用 データベースですか? SQL serverの中にデータベースやテーブルを作成する場合は、私はコードで行っています。Word文書でテーブルを設計して、そこからCreate Tableなどのコードを自動生成するツール(自作)を使っています。こうしておくとテーブルの仕様書も自動的に残るので、後々便利です。 なるほど。Accessで作業をしているときから、自分だけが使用するものにしても仕様書のことでいつも頭を悩ましていたのですが、そのような方法もあるのですね。(といってもどのようにやっているか現時点での私には皆目見当がつかないのですが。)
非常に興味があることなので、自分でも調べてみたいと思います。
本当にありがとうございました。
-
TI-cb400s さんからの引用
Accessで作業をしているときから、自分だけが使用するものにしても仕様書のことでいつも頭を悩ましていたのですが、そのような方法もあるのですね。(といってもどのようにやっているか現時点での私には皆目見当がつかないのですが。)
今ならVSTOでやるんでしょうが、当時はそんなものなかったので、Word文書のテーブルからCSVファイルをはくマクロを作って、そのCSVをVB6で読み込んで、テーブル、登録、更新、削除の各ストアドプロシージャ、テーブル登録日時を記録するトリガー、テーブル変更日時を記録するトリガーを生成するT-SQLをはくようにしています。
全部Wordのマクロでやる手もあったんでしょうが、VB6で処理する方が簡単に思えたものですから。(^^;
ただ、テーブル作成の全てのパターンに対応しているわけではありません。対応しているのは、主キー、インデックス、外部参照性制約、NOT NULL、自動インクリメント列ぐらいです。次はVSTOで作り変えようということが、バージョンアップを怠ける理由になっているのかもしれません。(^^;
ですので、VSTOを調べてみて下さい。#どこかに落ちてないかなー