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

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

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

Re[4]: 2つのtableから1つtableへ出力する


(過去ログ 67 を表示中)

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

■38818 / inTopicNo.1)  2つのtableから1つtableへ出力する
  
□投稿者/ sol (6回)-(2009/07/25(Sat) 13:56:32)

分類:[ソフトウェア全般] 

質問です
基本知識とは思いますが、相談させてください
私は、Access,Cobolで開発する時、2つのテーブルを突き合わせ
1つのテーブルにアウトするというコーディング(印刷専用のデータを作成したりする)をたびたびしました
(つまりIN2つOUT1つのtableを使用するマッチング)
しかしC#のプログラム書籍をみるとあまりというか全く見当たりません
MSDNのQ&Aにも例が、わずかにしか無いようです(MSDNのQ&A:テーブルを1行ずつ更新するコーディング)
なぜあまり例がないのか?
こういった作成方法は古いんでしょうか?
.NETはSQLで何とか!?するんでしょうか?
何か荒唐無稽な質問ですが今後の指針としたいので心得を教えて頂けないでしょうか?
引用返信 編集キー/
■38819 / inTopicNo.2)  Re[1]: 2つのtableから1つtableへ出力する
□投稿者/ 魔界の仮面弁士 (1163回)-(2009/07/25(Sat) 14:01:34)
No38818 (sol さん) に返信
> 私は、Access,Cobolで開発する時、2つのテーブルを突き合わせ
> 1つのテーブルにアウトするというコーディング(印刷専用のデータを作成したりする)をたびたびしました
> (つまりIN2つOUT1つのtableを使用するマッチング)
> しかしC#のプログラム書籍をみるとあまりというか全く見当たりません

具体例が無いとイメージが沸きませんが、C# で
 (1) SQL 側で付き合わせる。(INNER JOIN / LEFT JOIN)
 (2) 2つのテーブルをプログラム側で付き合わせる。
のどちらか(あるいは両方)で処理する事は、そこそこ行っていますよ。当方では。
引用返信 編集キー/
■38824 / inTopicNo.3)  Re[2]: 2つのtableから1つtableへ出力する
□投稿者/ sol (7回)-(2009/07/25(Sat) 15:57:51)
No38819 (魔界の仮面弁士 さん) に返信
Sqlserver2005:Vista:C# 2008

> 具体例が無いとイメージが沸きませんが、

掲示板に書き込むの躊躇しましたが、結構頭の中でこんがらがってしまって、指針だけでも・・と・・

>  (1) SQL 側で付き合わせる。(INNER JOIN / LEFT JOIN)

SQLのselectなどで創意工夫するわけですね

印刷専用のテーブル作る場合、やはり「table3をcreateしてInsertするか、事前にtable3を作っておいてデータをInsertする」ような感じでしょうか?
最終的には好みかもしれませんが、一般的には後者ですか?

>  (2) 2つのテーブルをプログラム側で付き合わせる。

{MSDN Q&Aより SqlCommandとSqlDataReaderを用いてRead()メソッドで1レコードずつ読み取り、SqlCommand.ExecuteNonQuery()で更新を1レコードずつ行う。}

Readの所を(マスター(table1):トランザクション(table2))Readを二重ループみたいにして、アウトファイル(table3)へ出力
→読み取り(Read)2つと、更新(OUT)1つは別のコネクションにしなければならないので、SqlConnectionを3つ使うようなイメージなんでしょうか?

取り合えず両面から行けますということが分かり一歩進んだ気がします
ありがとうございます
引用返信 編集キー/
■38825 / inTopicNo.4)  Re[3]: 2つのtableから1つtableへ出力する
□投稿者/ 魔界の仮面弁士 (1165回)-(2009/07/25(Sat) 16:44:39)
2009/07/25(Sat) 16:51:46 編集(投稿者)

No38824 (sol さん) に返信
> 印刷専用のテーブル作る場合、やはり「table3をcreateしてInsertするか、事前にtable3を作っておいてデータをInsertする」ような感じでしょうか?
帳票作成のために、動的に CREATE TABLE する事はまず無いですね。

そもそもデータの集計に時間がかからないのであれば、DB 側には table3 は作りません。
「DB 上の table1」と「DB 上の table2」から、C# 上で新たな「DataTable」を作るのみです。

データの集計に時間がかかる場合には、DB 上に予め table3 を作っておき、そこに帳票データを INSERT する事も
ありますが、その場合の table3 は、一時テーブル(処理完了後、DB によって自動クリアされる表)を使う場合と
通常のテーブルを使う場合とがあります。帳票データを印刷以外に再利用する必要がある場合には後者ですね。


> 最終的には好みかもしれませんが、一般的には後者ですか?
好みというか、case-by-case だと思いますよ。
どれが一般的というわけではなく、それぞれの要件・状況に応じて、都合の良い方法を組み合わせて使うことになると思います。


>> (2) 2つのテーブルをプログラム側で付き合わせる。
> {MSDN Q&Aより SqlCommandとSqlDataReaderを用いてRead()メソッドで1レコードずつ読み取り、SqlCommand.ExecuteNonQuery()で更新を1レコードずつ行う。}
(SqlDataReader という事は、SQL Server の話でしょうか?)

処理によってはそのような手法をとる事はありますが、私の場合、帳票目的でその手法を使った事はあまりありません。

DataReader を使って帳票を作るとすれば、DB 側には書き戻さず、DataTable に蓄えて、それを帳票ツールに
渡すだけで済ませてしまいますし、もしも、帳票用に加工したデータを DB 上の table3 に蓄える必要があるとしても、
一行ずつデータ変換していくような処理は、(C# 側ではなく)DB 側のストアドやジョブに任せる事が多いです。


そもそも私の場合、大抵は (1) の SQL 処理で済ませてしまうのですが、
SQL では処理しきれず、どうしても一行ずつ C# 側で付き合わせる必要があるような場合には、
DB 上の 2 つのテーブルを、TableAdapter 経由で C# 側の DataTable へ取り込み、それらを
 (a) LINQ to DataSet で繋いで、CopyToDataTable する。
 (b) それぞれの DataRow をループ処理で付き合わせ、3 つ目の DataTable に転記する。
 (c) 2 つの DataTable を DataSet 内のリレーションで結び、必要に応じてそれぞれに「式列」などを追加する。
などの方法で処理する事が多いですね。

サーバーに書き戻す必要がある場合には (b) を使い、TableAdapter で Update 等を行います。
サーバーに保存する必要が無く、帳票出力だけを行う場合には (c) ですね。
(c) の場合、結合した DataTable3 を作成するのではなく、DataSet そのものを帳票ツールにデータバインドさせるのみで。
引用返信 編集キー/
■38836 / inTopicNo.5)  Re[4]: 2つのtableから1つtableへ出力する
□投稿者/ sol (11回)-(2009/07/26(Sun) 01:24:49)
No38825 (魔界の仮面弁士 さん) に返信
> 2009/07/25(Sat) 16:51:46 編集(投稿者)
>
> ■No38824 (sol さん) に返信
>>印刷専用のテーブル作る場合、やはり「table3をcreateしてInsertするか、事前にtable3を作っておいてデータをInsertする」ような感じでしょうか?
> 帳票作成のために、動的に CREATE TABLE する事はまず無いですね。
>
> そもそもデータの集計に時間がかからないのであれば、DB 側には table3 は作りません。
> 「DB 上の table1」と「DB 上の table2」から、C# 上で新たな「DataTable」を作るのみです。
>
> データの集計に時間がかかる場合には、DB 上に予め table3 を作っておき、そこに帳票データを INSERT する事も
> ありますが、その場合の table3 は、一時テーブル(処理完了後、DB によって自動クリアされる表)を使う場合と
> 通常のテーブルを使う場合とがあります。帳票データを印刷以外に再利用する必要がある場合には後者ですね。
>
>
>>最終的には好みかもしれませんが、一般的には後者ですか?
> 好みというか、case-by-case だと思いますよ。
> どれが一般的というわけではなく、それぞれの要件・状況に応じて、都合の良い方法を組み合わせて使うことになると思います。
>
>
> >> (2) 2つのテーブルをプログラム側で付き合わせる。
>>{MSDN Q&Aより SqlCommandとSqlDataReaderを用いてRead()メソッドで1レコードずつ読み取り、SqlCommand.ExecuteNonQuery()で更新を1レコードずつ行う。}
> (SqlDataReader という事は、SQL Server の話でしょうか?)
>
> 処理によってはそのような手法をとる事はありますが、私の場合、帳票目的でその手法を使った事はあまりありません。
>
> DataReader を使って帳票を作るとすれば、DB 側には書き戻さず、DataTable に蓄えて、それを帳票ツールに
> 渡すだけで済ませてしまいますし、もしも、帳票用に加工したデータを DB 上の table3 に蓄える必要があるとしても、
> 一行ずつデータ変換していくような処理は、(C# 側ではなく)DB 側のストアドやジョブに任せる事が多いです。
>
>
> そもそも私の場合、大抵は (1) の SQL 処理で済ませてしまうのですが、
> SQL では処理しきれず、どうしても一行ずつ C# 側で付き合わせる必要があるような場合には、
> DB 上の 2 つのテーブルを、TableAdapter 経由で C# 側の DataTable へ取り込み、それらを
>  (a) LINQ to DataSet で繋いで、CopyToDataTable する。
>  (b) それぞれの DataRow をループ処理で付き合わせ、3 つ目の DataTable に転記する。
>  (c) 2 つの DataTable を DataSet 内のリレーションで結び、必要に応じてそれぞれに「式列」などを追加する。
> などの方法で処理する事が多いですね。
>
> サーバーに書き戻す必要がある場合には (b) を使い、TableAdapter で Update 等を行います。
> サーバーに保存する必要が無く、帳票出力だけを行う場合には (c) ですね。
> (c) の場合、結合した DataTable3 を作成するのではなく、DataSet そのものを帳票ツールにデータバインドさせるのみで。


参考になりました
魔界の仮面弁士様
ありがとうございます
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -