C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: データベースから取得したデータを独自クラスに変換


(過去ログ 137 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■80759 / inTopicNo.1)  データベースから取得したデータを独自クラスに変換
  
□投稿者/ のぶくん (1回)-(2016/08/09(Tue) 18:14:04)

分類:[C#] 

以前どこかで「データベースからデータを取得し、Bindingメソッドに独自クラスを指定すると(半?)自動的にクラスのオブジェクトに変換できる」
というような情報を見かけた事があります。

しかし、記憶があいまいで、どうやっても見つけられていませんので、何かお知りの方がいらっしゃったら教えていただけませんか?

あいまいな記憶では・・・
・C#だったような
・SELECT文を実行して得られるオブジェクトからBindingメソッドを実行したような
・独自クラスにはなにやら属性をつけていたような
という事があったはずです。

もしかしたら全然別の言語かもしれませんがよろしくお願いします。
引用返信 編集キー/
■80760 / inTopicNo.2)  Re[1]: データベースから取得したデータを独自クラスに変換
□投稿者/ WebSurfer (995回)-(2016/08/09(Tue) 19:05:32)
No80759 (のぶくん さん) に返信

そういう質問者さん自身も何かよく分からないというような質問は、何を作っていて、
どういう目的で何をしたいのかなど全体的なシナリオを含めた質問者さんのやりたい
ことを書いてもらうのが、回答者の方は質問者さんの状況が理解できて回答しやすい
思いますが、いかがですか?
引用返信 編集キー/
■80769 / inTopicNo.3)  Re[2]: データベースから取得したデータを独自クラスに変換
□投稿者/ のぶくん (2回)-(2016/08/10(Wed) 09:29:37)
2016/08/10(Wed) 09:30:03 編集(投稿者)
No80760 (WebSurfer さん) に返信

ご返信ありがとうございます。
また、状況説明が足りずに申し訳ありません。

やりたい事というと、「DB(SQLite)からデータを取得し、それを独自クラスのコレクションに変換したい」です。
その中で上記質問の様な事が確かあったはず・・・と思ったので質問いたしました。

現状として抜粋すると、
using(var reader = await cmd.ExecuteReaderAsync())
{
  while (reader.Read())
  {
    //各カラムにアクセスしデータを取得し、独自クラスへ変換したい!
    var piyo = new Piyo(reader);
  }
}

class Piyo
{
  public Piyo((System.Data.Common.DbDataReader reader)
  {
    Hoge = reader["hoge"].ToString();
    Fuga = reader["fuga"].ToString();
  }
}
という形をとっています。

ただこれだと、reader["hoge"]の部分がフィールド名を直書きで不便なので、
上記の質問に戻り、「確かそんな事ができたはずなんだけどなぁ・・・」と調べていました。

今は調べている最中なので環境は不定ですが、以下を想定しています。
Visual Studio 2013 or 2015
.NET Framework 4.5 以上?
開発OS:Windows 7 or 10
実行OS:Windows VISTA 以上 or 7 以上

引用返信 編集キー/
■80770 / inTopicNo.4)  Re[3]: データベースから取得したデータを独自クラスに変換
□投稿者/ PANG2 (136回)-(2016/08/10(Wed) 09:58:18)
2016/08/10(Wed) 10:47:41 編集(投稿者)

型付DataSetの話?

C# + SQLite 初体験
http://d.hatena.ne.jp/nanjakkun/20091104/1257328853

を見るとDataSetデザイナーで作成するのかな。(型付DataSet自動作成は対応していない?)
まずは、DataSet/DataAdapterの仕組みを理解するのが必須。

(追記)
もしくは、
Entity Framework + SQLite

http://d.hatena.ne.jp/tueda_wolf/20131025/p1
http://maverickproj.web.fc2.com/SQLite_01.html
引用返信 編集キー/
■80775 / inTopicNo.5)  Re[3]: データベースから取得したデータを独自クラスに変換
□投稿者/ WebSurfer (996回)-(2016/08/10(Wed) 12:22:12)
No80769 (のぶくん さん) に返信

失礼ながら、アップされたコードを拝見すると基本的・初歩的な文法が理解されていな
いようです。まずは本を読むなどしてそのあたりの勉強をする必要がありそうですね。

なので、私のレスを理解してもらえるかどうか分かりませんが、とりあえず基本的なや
り方を提案します。不明な点があれば質問してください。また、以下の提案が質問者さ
んのやりたいこととは違う場合は具体的にどう違うか書いてください。


> DB(SQLite)からデータを取得し、それを独自クラスのコレクションに変換したい

「独自クラス」というのはアップされたコードでは Piyo に該当し、DB からレコード
を取得して Piyo クラスのプロパティに設定し、DB のレコード数分の Piyo クラスの
コレクション(例えば List<Piyo>)を作ると言うのがやりたいことと理解します。

まず、Piyo クラスですが、DB から取得したデータを設定 / 取得するためのプロパテ
ィを定義します。以下のような感じです。Hoge, Fuga の型が不明ですがとりあえず
string としておきします。

public class Piyo
{
    public string Hoge { get; set; }
    public string Fuga { get; set; }
}

次は、コレクション List<Piyo> を初期化し、while (reader.Read()) のループで 
Piyo クラスのインスタンスを生成して取得したデータを Fuge, Hoge プロパティに
代入し、コレクションに追加していけばいいと思います。以下のような感じです。

List<Piyo> piyos = new List<Piyo>();

while (reader.Read())
{
    Piyo piyo = new Piyo();
    piyo.Hoge = reader["hoge"].ToString();
    piyo Fuga = reader["fuga"].ToString();
    piyos.Add(piyo);
}

DB の hoge, fuga が NULL 許可になっている場合は代入する前にチェックしないと
ダメかも(SQL Server と同様に IsDBNull メソッドが使えれば、それでチェックす
るのがよさそうです)。

引用返信 編集キー/
■80779 / inTopicNo.6)  Re[3]: データベースから取得したデータを独自クラスに変換
□投稿者/ PANG2 (137回)-(2016/08/10(Wed) 14:22:44)
2016/08/10(Wed) 14:27:55 編集(投稿者)
No80769 (のぶくん さん) に返信
> class Piyo
> {
>   public Piyo((System.Data.Common.DbDataReader reader)
>   {
>     Hoge = reader["hoge"].ToString();
>     Fuga = reader["fuga"].ToString();
>   }
> }
> という形をとっています。
> 
> ただこれだと、reader["hoge"]の部分がフィールド名を直書きで不便なので、
> 上記の質問に戻り、「確かそんな事ができたはずなんだけどなぁ・・・」と調べていました。


リフレクションで書いてみた。

class Piyo
{
	public string hoge { get; set; }
	public string fuga { get; set; }

	public Piyo(System.Data.Common.DbDataReader reader)
	{
		for (int i = 0; i < reader.FieldCount; i++) {
			string name = reader.GetName(i);
			System.Reflection.PropertyInfo p = this.GetType().GetProperty(name);
			if (p != null)
				p.SetValue(this, reader[i].ToString(), null);
		}
	}
}

引用返信 編集キー/
■80780 / inTopicNo.7)  Re[4]: データベースから取得したデータを独自クラスに変換
□投稿者/ のぶくん (3回)-(2016/08/10(Wed) 14:42:54)
No80770 (PANG2 さん) に返信
>
> 型付DataSetの話?
>
> もしくは、
> Entity Framework + SQLite
>

ご返信ありがとうございます。
以前見かけたモノはどちらも使用していなかったような・・・
とはいえ、以前見かけた情報そのものを教えてくれ!!という事ではないのでありがたいです。

その2つの内容を見ていてふと思ったのが、自力でEFなりで使用される属性を適用させたクラスを定義し
EF等に関連するメソッドでコンバート(?)するという事は可能なんでしょうかね?(意味があるかは別として)
もしかしたら「自力EF」みたいな情報だったのかも・・・と思ってきてしまいました。
引用返信 編集キー/
■80781 / inTopicNo.8)  Re[4]: データベースから取得したデータを独自クラスに変換
□投稿者/ のぶくん (4回)-(2016/08/10(Wed) 14:47:48)
2016/08/10(Wed) 14:48:11 編集(投稿者)
No80779 (PANG2 さん) に返信
> リフレクションで書いてみた。
> 
> class Piyo
> {
> 	public string hoge { get; set; }
> 	public string fuga { get; set; }
> 
> 	public Piyo(System.Data.Common.DbDataReader reader)
> 	{
> 		for (int i = 0; i < reader.FieldCount; i++) {
> 			string name = reader.GetName(i);
> 			System.Reflection.PropertyInfo p = this.GetType().GetProperty(name);
> 			if (p != null)
> 				p.SetValue(this, reader[i].ToString(), null);
> 		}
> 	}
> }

おー!リフレクション!!!
ありがとうございます!

リフレクションはコストが高いと聞いたことがあるので、実際にやってみたいとおもいます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -