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

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

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

DataTableの更新について

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

■94725 / inTopicNo.1)  DataTableの更新について
  
□投稿者/ tomo (1回)-(2020/05/10(Sun) 18:20:31)

分類:[.NET 全般] 

Visual StudioでExcelのデータをDataGridViewに表示するWindowsFormを作成しています。
Excelには複数シートあるためシート名を取得してきてコンボボックスから選択できるようにしました。
シートを選択し検索ボタンを押すと以下のコードが走ります。

    private DataTable dt = new DataTable();

    --中略

        private void button1_Click(object sender, EventArgs e)//検索押下
        {
            dt.Clear();
            
            GetExcelData();
            dataGridView1.DataSource = dt;
        }


    private void GetExcelData()
        {
            string sheet = comboBox1.Text;

            if (sheet != "")
            {

                OleDbConnection conn = new OleDbConnection();
                conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                            @"C:\Users\flowe\Desktop\ExcelTestData\Summer_Olympic_medallists_1896-2008.xlsx" +
                            @";Extended Properties=Excel 12.0;";
                conn.Open();

                //SQL発行
                var sqlcmd = $"SELECT * FROM [{sheet}$]";

                OleDbCommand cmd = new OleDbCommand(sqlcmd, conn);
                OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
                adp.Update(dt);
                adp.Fill(dt);

                conn.Close();
            }
            else
            {
                MessageBox.Show("シートを選択してください");
            }
        }

1回目の検索ではうまく表示されるのですが、コンボボックスで別のシートを選択してもう一度検索ボタンを押すと1度目に検索したシートのカラム名が残ったままになります。
そしてそのカラムにはすべてデータは空白になり、それに付け加わる形で今回の検索のデータが表示されます。
DataTableのClearではだめなのでしょうか。
DataTableのResetも試しましたがこちらはカラム名はうまく表示されましたが2度目以降の検索でデータが表示されなくなってしまいました。

どなたかご教授頂けないでしょうか。

引用返信 編集キー/
■94726 / inTopicNo.2)  Re[1]: DataTableの更新について
□投稿者/ WebSurfer (2050回)-(2020/05/10(Sun) 18:40:31)
No94725 (tomo さん) に返信

ベタなやり方ですが、別のシートの情報を取得してくる前にその都度、

dt = new DataTable();

を実行してはいかがですか?
引用返信 編集キー/
■94728 / inTopicNo.3)  Re[2]: DataTableの更新について
□投稿者/ tomo (3回)-(2020/05/10(Sun) 19:48:05)
No94726 (WebSurfer さん) に返信
> ■No94725 (tomo さん) に返信
>
> ベタなやり方ですが、別のシートの情報を取得してくる前にその都度、
>
> dt = new DataTable();
>
> を実行してはいかがですか?

返答ありがとうございます。
その方法ではうまくできたのですが、やはり毎回インスタンスを生成するのは気持ち悪い感じがします。
あまりメモリの解放には詳しくないのですが、10回検索をするとその分だけメモリを奪ってしまいますよね?
明示的に開放すればそれまでですが、あまり良いコードではないような気がしております...。
引用返信 編集キー/
■94729 / inTopicNo.4)  Re[3]: DataTableの更新について
□投稿者/ Hongliang (1028回)-(2020/05/10(Sun) 20:01:11)
> あまりメモリの解放には詳しくないのですが、10回検索をするとその分だけメモリを奪ってしまいますよね?
DataTable全体で考えればそれなりにメモリ量を使用していますが、結局最もメモリ量を使うのはテーブルの各セルの値なので、それらを全部載せ替えるのを考えたら、DataTable自体のメモリ消費など誤差にすぎません。
引用返信 編集キー/
■94730 / inTopicNo.5)  Re[3]: DataTableの更新について
□投稿者/ WebSurfer (2051回)-(2020/05/10(Sun) 20:42:05)
No94728 (tomo さん) に返信

> あまり良いコードではないような気がしております...。

では、あなたの考える「良いコード」というのはどういうものなんですか?

私の提案以上に、すべての面にわたって「良いコード」があれば教えてほしいものです。

ただし、すべての面と言っても、あなたの気持ちの問題は別の話ですよ。


引用返信 編集キー/
■94731 / inTopicNo.6)  Re[1]: DataTableの更新について
□投稿者/ KOZ (116回)-(2020/05/10(Sun) 21:43:46)
No94725 (tomo さん) に返信
> DataTableのClearではだめなのでしょうか。
> DataTableのResetも試しましたがこちらはカラム名はうまく表示されましたが2度目以降の検索でデータが表示されなくなってしまいました。

dataGridView1.DataSource = "";
dataGridView1.DataSource = dt;

これでどうですか?
引用返信 編集キー/
■94736 / inTopicNo.7)  Re[4]: DataTableの更新について
□投稿者/ tomo (5回)-(2020/05/11(Mon) 21:18:56)
No94729 (Hongliang さん) に返信
> DataTable全体で考えればそれなりにメモリ量を使用していますが、結局最もメモリ量を使うのはテーブルの各セルの値なので、それらを全部載せ替えるのを考えたら、DataTable自体のメモリ消費など誤差にすぎません。
各セルの値が最もメモリを使用するのは理解できます。
ただそのようなセルを値を持つDataTableのインスタンスを複数生成するとその分メモリ量を使用するということは起こらないのですか?
インスタンスを1つにしてデータを乗せ換えるようにすればメモリを節約できるのはと思いました。



No94730 (WebSurfer さん) に返信
> ■No94728 (tomo さん) に返信
>
> では、あなたの考える「良いコード」というのはどういうものなんですか?
>
> 私の提案以上に、すべての面にわたって「良いコード」があれば教えてほしいものです。
>
> ただし、すべての面と言っても、あなたの気持ちの問題は別の話ですよ。

インスタンスを1つだけ生成しシートを切り替えるごとにデータをリフレッシュして乗せ換えれば複数インスタンスを生成せずにメモリを節約できるのはないかと考えております。
引用返信 編集キー/
■94737 / inTopicNo.8)  Re[5]: DataTableの更新について
□投稿者/ 魔界の仮面弁士 (2709回)-(2020/05/11(Mon) 21:52:33)
No94736 (tomo さん) に返信
> ただそのようなセルを値を持つDataTableのインスタンスを複数生成するとその分メモリ量を使用するということは起こらないのですか?

DataSet をひたすら New するだけでも、いずれ応答無しになるという事象があります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=81781&KLOG=140


> インスタンスを1つにしてデータを乗せ換えるようにすればメモリを節約できるのはと思いました。

同じ DataSet を Clear して使いまわし、データだけ差し替えて使うようにすると、
登録してある件数が少なくても、処理が低速化していってしまう、という事象もあります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=92132&KLOG=159
引用返信 編集キー/
■94738 / inTopicNo.9)  Re[5]: DataTableの更新について
□投稿者/ WebSurfer (2052回)-(2020/05/11(Mon) 22:36:52)
No94736 (tomo さん) に返信

>>では、あなたの考える「良いコード」というのはどういうものなんですか?
>>
>>私の提案以上に、すべての面にわたって「良いコード」があれば教えてほしいものです。
>>
>>ただし、すべての面と言っても、あなたの気持ちの問題は別の話ですよ。
>
> インスタンスを1つだけ生成しシートを切り替えるごとにデータをリフレッシュして乗せ換えれば複数インスタンスを生成せずにメモリを節約できるのはないかと考えております。

それがあなたの考える「良いコード」だと思うならここで聞くまでもなくそのように実装すればいい
と思うのですが・・・

なぜそうしないのですか? 気持ちの問題も含めて全て解決できるのでは?
引用返信 編集キー/
■94743 / inTopicNo.10)  Re[5]: DataTableの更新について
□投稿者/ WebSurfer (2053回)-(2020/05/12(Tue) 10:54:32)
No94736 (tomo さん) に返信

単純に考えて、例えば、

public MyDataTable
{
  public HeavilyMemoryConsumingClass myClass;
}

というようなクラスで、そのフィールド myClass の参照先の HeavilyMemoryConsumingClass クラ
スのインスタンスが非常に大きくメモリを消費するとします。

DataTable で言うと、MyDataTable が外枠、その中身が HeavilyMemoryConsumingClass に該当する
と思ってください。

dt = new MyDataTable(); とするのと、dt.myClass = new HeavilyMemoryConsumingClass(); とする
のとでは、外枠を使いまわすか否かの違いで、メモリの消費量の差は外枠だけだと思うのですが。そ
れもガベージコレクタに処理を任せておけばよさそうです。

その差を埋めるためのコーディングをする工数(保守工数もあるかも)を使うのにどれだけ価値があ
るかという話になるかと思います。

話を戻して DataTable で今回の質問者さんの使い方の場合、質問者さんにとってはその価値がある
のでしょうか?

どうしても外枠を使いまわしたい、それ以外の方法は聞く耳持たないということであれば、その旨
最初に質問に書いておいていただけたらと思います。
引用返信 編集キー/
■94747 / inTopicNo.11)  Re[1]: DataTableの更新について
□投稿者/ furu (34回)-(2020/05/12(Tue) 15:24:48)
No94725 (tomo さん) に返信
そもそもの質問に対して

> DataTableのClearではだめなのでしょうか。
DataTable.Clearメソッドは「DataTable からすべてのデータを消去します」なので
カラム名などはそのままですね。

> DataTableのResetも試しましたがこちらはカラム名はうまく表示されましたが2度目以降の検索でデータが表示されなくなってしまいました。
DataTable.Resetメソッドの説明にある
「DataSet に DataTable が含まれている場合は、
 テーブルをリセットした後も、テーブルは DataSet の一部です」が関係しているのかな。
DataSet.Tables.Removeとか。
すみません。
この辺、詳しくないので適当なこと書いてます。

でも、このようなクラスはどんなリソース食うかわからないので
使いまわしたほうがメモリや速度的にいいかなって気持ち
すごくわかります。
引用返信 編集キー/
■94755 / inTopicNo.12)  Re[2]: DataTableの更新について
□投稿者/ tomo (6回)-(2020/05/12(Tue) 18:17:24)
皆様ご回答ありがとうございます。
このような処理をする場合は毎回DataTableを作成してもメモリの消費量はほぼ変わらず、そのメモリの使用量を減らすことに注力する必要があるかどうかというところですね。
今回は勉強として作成したプログラムですのでDataTableを毎回作成するようにします。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ