- PR -

Winフォームにおける画面要素の保持の仕方について

投稿者投稿内容
やす
会議室デビュー日: 2008/06/11
投稿数: 7
投稿日時: 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件づつ処理するためです。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-06-11 18:38
で、画面要素を保持することと、どの様な関係があるのでしょう?


DataTable に、NewDataRow の様なメソッドがありませんか?
やす
会議室デビュー日: 2008/06/11
投稿数: 7
投稿日時: 2008-06-11 21:36
そうですね。タイトルと質問内容がずれてます。

DataTableのNewDataRowは、現在の列定義で1行追加する、というような意味ですよね。

例えば、
 Selectした結果をDataTableに格納
 そのDataTableに一行追加
という流れは可能だと思いますが、Selectがないフローでは列定義を自分で作る必要があり、

 DataTable(DataRow)を自分で定義
 そのDataTableに一行追加

とすると、DataTableの作り方が2種類になってしまう。

というのをどう解決するかを考えています。

タイトルを画面要素の保持の仕方としたのは、データ構造をDataTableで持った場合、
列定義は、自分で作らないといけないのかな、皆さんはどうしてるのかな、という意味です。

わかりづらくてすみません。

ぴんふ
ベテラン
会議室デビュー日: 2006/07/13
投稿数: 80
投稿日時: 2008-06-12 09:24
こんにちは。ぴんふです。

データをインサートするということはユーザが画面に入力したデータ
をインサートするのでは?
となるとそのテーブルの列定義を意識した作りになるのが必然だと思います。

なので私ならSelectしていようがいまいが列定義を作成しておきます。
テーブルの列定義が変更になればプログラムにも手が入る可能性は高いのでそのコストは惜しまないです。
やす
会議室デビュー日: 2008/06/11
投稿数: 7
投稿日時: 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 ]
未記入
会議室デビュー日: 2005/07/19
投稿数: 15
投稿日時: 2008-06-12 17:14
DataRowを引数にしたメソッドを作ろうとしているのが、間違っているのです。
やす
会議室デビュー日: 2008/06/11
投稿数: 7
投稿日時: 2008-06-12 18:16
ご返信ありがとうございます。

DataRowを引数にしているのが間違っているというのは、どういった意味ででしょうか?
よろしければ教えてください。

###########

いろいろ調べているのですが、
データベースエクスプローラ(サーバエクスプローラ)からDataTableの定義を
自動作成する機能があるんですね。

これを使えば、事前にDBから列定義を作ることが出来るので、DataTableのAddRow的
なことで新規データもDataTableに格納できそうです。

ただし型付きのデータセットを画面のデータ構造として利用すると、ヌル制約や、
データ型の制約が厳しすぎる画面もあります。

特にDataTableをデータソースとしてバインドする場合は、ユーザ入力が禁止する
値だったときに値がDataTableに代入できなくなってしまう。

自動で作った定義の制約を緩めてまわるのもなんだかなーと思います。
データベースの定義が変わるたびに定義の再作成⇒定義の制約緩和を行うことに
なりそうなので。

というわけで今のところ、型なしのDataTableを手動で定義して、データベースに格納
可能かは、チェック関数を自作するのが良いのかと思っています。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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 ]

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