- - PR -
Winフォームにおける画面要素の保持の仕方について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-06-11 18:19
質問があります。
環境) .Net Framework2.0 VS2005 C# 現在C#でWinフォームの開発をしていて、設計で迷っているのですが、 1.まずデータベースアクセス用のクラスを作りました。 ↓その中のメソッド //DataRowの要素をXXXテーブルにインサートする public void insertXXX(DataRow dr) { } //DataRowの要素をXXXテーブルにアップデートする public void updateXXX(DataRow dr) { } 2.ここで、上記メソッドを呼ぶ際に、DataRowが作られていることが前提に なりますが、アップデートの方は、その前にSELECTの結果をDataTableに格納 して、それを維持・編集していけば良いとして、インサートの方は、DataRowを 作らないといけません。 その場合、 A.DataRowをnewして、列を静的に作る B.DataRowをnewして、列を動的に作る(テーブルの列情報をDBから取得する) C.結果が0件のSELECT分を発行して、DataRowを作成する(これが本当に可能か は知りません) のようなことを行う必要が出てきて、「A.」を行った場合、その部分のソースが テーブルレイアウトに依存するためすっきりしない気がしますし、Bの場合はDB にアクセスするほどのことか、と思います。 また、DataRowの構造(列名や型など)をプログラマが「作る」ならば、SELECT した結果も dt = new DataTable(); adapter.Fill(dt); ではなく、作った構造の方に入れなくては、別の入れ物が2種類あることになって しまう。 .NETでデータベースアクセスする際には、どのような構成にするのが良いので しょうか。 皆様の意見を教えてください。 DataRowを引数にしたメソッドを作ろうとしているのが、間違っているのでしょうか。 DataRowにした理由は、DataTableのレコードを1件づつ処理するためです。 よろしくお願いします。 |
|
投稿日時: 2008-06-11 18:38
で、画面要素を保持することと、どの様な関係があるのでしょう?
DataTable に、NewDataRow の様なメソッドがありませんか? |
|
投稿日時: 2008-06-11 21:36
そうですね。タイトルと質問内容がずれてます。
DataTableのNewDataRowは、現在の列定義で1行追加する、というような意味ですよね。 例えば、 Selectした結果をDataTableに格納 そのDataTableに一行追加 という流れは可能だと思いますが、Selectがないフローでは列定義を自分で作る必要があり、 DataTable(DataRow)を自分で定義 そのDataTableに一行追加 とすると、DataTableの作り方が2種類になってしまう。 というのをどう解決するかを考えています。 タイトルを画面要素の保持の仕方としたのは、データ構造をDataTableで持った場合、 列定義は、自分で作らないといけないのかな、皆さんはどうしてるのかな、という意味です。 わかりづらくてすみません。 |
|
投稿日時: 2008-06-12 09:24
こんにちは。ぴんふです。
データをインサートするということはユーザが画面に入力したデータ をインサートするのでは? となるとそのテーブルの列定義を意識した作りになるのが必然だと思います。 なので私ならSelectしていようがいまいが列定義を作成しておきます。 テーブルの列定義が変更になればプログラムにも手が入る可能性は高いのでそのコストは惜しまないです。 |
|
投稿日時: 2008-06-12 11:12
ご返信ありがとうございます。
構成としては、 連記画面(DataGridView)----DataTable-----DataAccessClass----データベース 単票画面---------------- で考えていて、それぞれの関係は、 ・DataGridViewは、DataTableの要素を表示する(変更不可) ・単票画面(テキストボックス群)は、 ・・DataTableの一つのDataRowを表示する。 ・・DataTableに対して、新規作成・変更を行う。 ・DataAccessClassは、データベースの値をDataTableに格納する ・DataAccessClassは、DataTableの値をデータベースに更新する ・連記画面で行を選択して、単票画面に遷移する。 です。 DataTableの列定義を自分で行い、DataAccessClassはデータベースの値を 自分で定義したDataTableに格納する。 (DataAdapter.Fillではなく、DataReaderをループしながら格納していく?) という感じでいこうかと思っています。 [ メッセージ編集済み 編集者: やす 編集日時 2008-06-12 11:13 ] [ メッセージ編集済み 編集者: やす 編集日時 2008-06-12 11:16 ] [ メッセージ編集済み 編集者: やす 編集日時 2008-06-12 11:17 ] |
|
投稿日時: 2008-06-12 17:14
DataRowを引数にしたメソッドを作ろうとしているのが、間違っているのです。
|
|
投稿日時: 2008-06-12 18:16
ご返信ありがとうございます。
DataRowを引数にしているのが間違っているというのは、どういった意味ででしょうか? よろしければ教えてください。 ########### いろいろ調べているのですが、 データベースエクスプローラ(サーバエクスプローラ)からDataTableの定義を 自動作成する機能があるんですね。 これを使えば、事前にDBから列定義を作ることが出来るので、DataTableのAddRow的 なことで新規データもDataTableに格納できそうです。 ただし型付きのデータセットを画面のデータ構造として利用すると、ヌル制約や、 データ型の制約が厳しすぎる画面もあります。 特にDataTableをデータソースとしてバインドする場合は、ユーザ入力が禁止する 値だったときに値がDataTableに代入できなくなってしまう。 自動で作った定義の制約を緩めてまわるのもなんだかなーと思います。 データベースの定義が変わるたびに定義の再作成⇒定義の制約緩和を行うことに なりそうなので。 というわけで今のところ、型なしのDataTableを手動で定義して、データベースに格納 可能かは、チェック関数を自作するのが良いのかと思っています。 |
|
投稿日時: 2008-06-12 19:19
テーブルの構成情報(スキーマ)だけを持ってくるメソッドがありませんか?
→ http://search.microsoft.com/results.aspx?q=fillschema+site%3Amsdn.microsoft.com%2Fja-jp%2Flibrary&qsc0=0&FORM=QBME1&l=1&mkt=ja-JP&PageType=99 [ メッセージ編集済み 編集者: Jitta 編集日時 2008-06-12 21:27 ] |