- PR -

型有りDatasetから、型無しデータセット

投稿者投稿内容
常連さん
会議室デビュー日: 2003/11/05
投稿数: 31
投稿日時: 2004-07-01 15:23
御疲れ様です。
データセット(Dataset)について質問です。
現在、大量のデータを、型(ユーザ定義型)のないデータセットから、型のあるデータセットに入れなおすという作業で、多くの時間がかかってしまい困っています。
C#を使ってプログラムを作って、使用しているみたいなのですが
.NETのフレームワーク自体にそんなツールは存在しないものでしょうかね?

ご存知ですか?ヌシの皆様。どうぞよろしくお願いします.
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-07-01 17:51
もう少し、具体例などで、説明してもらえないとわからないです。
常連さん
会議室デビュー日: 2003/11/05
投稿数: 31
投稿日時: 2004-07-01 21:31
ほんと申し訳ございません。
わたしも詳細がわからずに四苦八苦している状況なのですが、
分かる範囲でご説明しますと

WEBサービスを使って、データのやり取りをサーバとおこなっており、その際
DB(データベース)のさまざまなテーブルをいったん定義型のない
DATASETに格納します。その後、クライアント側でユーザ定義型のある
DATASETテーブルに再格納するという仕組みです。

そのコンバートをC#で作成したオリジナルを使用しているみたいですが
その時間が多くかかっております。

そこで.NETフレームワークに既存のものがあれば使用したいと思っているのですが・・・

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-01 22:16
引用:

卍さんの書き込み (2004-07-01 21:31) より:
そのコンバートをC#で作成したオリジナルを使用しているみたいですが
その時間が多くかかっております。


その時間とはコーディングの手間のことですか?
それとも変換処理が遅いということですか?

型付の方にMergeするとかでできないですかね?
※適当に言ってます、ごめんなさい。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-07-02 01:36
型付データセットは、DataSetを継承して作られたクラスなので、型のないデータセットとして利用することもできます。

例えば、
DsPubs dsPubs = new DsPubs();

とPubsテーブルの型付データセットを定義した場合、
型付データのアクセスの方法としては、

dsPubs.authors[0].au_fname = "abc";
のようになりますが、型のないのデータセットとして、以下のように書くことも可能です。

dsPubs.Tables["authors"].Rows[0]["au_fname"] = "abc";

…なので、データの設定元と設定先のスキーマが合ってさえいれば、型のないデータセットを型付データセットにセットすることはそんなに難しいことではないと思います。

もしスキーマが異なって入れのであれば、そのマッピング情報をどこかに定義する必要があると思うので、それについては、自分でコーディングするしかないと思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-07-02 01:58
# 件名と実際にやりたいことが逆じゃない?

引用:

…なので、データの設定元と設定先のスキーマが合ってさえいれば、型のないデータセットを型付データセットにセットすることはそんなに難しいことではないと思います。



ですね。

個々に代入するのが面倒なら、Xml を経由してもいいのかも。

DataSet ds = new DataSet();
// ds にデータを格納

MemoryStream stm = new MemoryStream();
ds.WriteXml (stm);
stm.Position = 0;

DsPubs dsPubs = new DsPubs();
dsPubs.ReadXml (stm);

引用:

もしスキーマが異なって入れのであれば、そのマッピング情報をどこかに定義する必要があると思うので、それについては、自分でコーディングするしかないと思います。



御意。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-07-02 10:13
とりあえずわかる範囲で。

目的:型なしデータセットから型ありデータセットへデータのコピー
dataset2:型なしデータセット
dataset1:型ありデータセット
テーブル名その他は同一とする
コード:
dataset1.Clear();
foreach (DataTable dt2 in dataset2.Tables)
{
  DataTable  dt1 = dataset1.Tables[dt2.TableName];
  foreach (DataRow dr2 in dt2.Rows) dt1.Rows.Add(dr2.ItemArray);
}


リレーションが張ってあると、tableの順番を変える必要があるかもしれません。
上記コードが遅いというのなら、根本的に実現方法を考え直した方がよいかもしれません。
常連さん
会議室デビュー日: 2003/11/05
投稿数: 31
投稿日時: 2004-07-02 10:40
ぬしさん、常連さん、ベテランさん、大ベテランさんまで多くのご意見ありがとうございます。

ヌシさんへ
>その時間とはコーディングの手間のことですか?
>それとも変換処理が遅いということですか?

すみません。分かり図らかったですね
変換処理が遅いほうです。


ZEBRAさん
>dsPubs.authors[0].au_fname = "abc";
>のようになりますが、型のないのデータセットとして、以下のように書くことも可能で>す。

>dsPubs.Tables["authors"].Rows[0]["au_fname"] = "abc";

ということは、dsPubs.authors[0].au_fname(型あり)= dsPubs.Tables["authors"].Rows[0]["au_fname"]
(形無し)でRowsをループでまわすということですね。


渋木宏明(ひどり)さん
># 件名と実際にやりたいことが逆じゃない?

そのとうりですね。すみません間違えました.
Webサービス越しにきた、型なしを→型有りのデータセットに置換したい
状況です。

cats
>dataset1.Clear();
>foreach (DataTable dt2 in dataset2.Tables)
>{
> DataTable dt1 = dataset1.Tables[dt2.TableName];
> foreach (DataRow dr2 in dt2.Rows) dt1.Rows.Add(dr2.ItemArray);
>}

なるほどです。
現在使用しているオリジナルがどのようなコーディングがされているかが
外からは見えないので分かりませんが、たいへん参考になります。ありがとうございます。





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