質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

C#にてSQLServerストアドプロシージャーの結果をdataGridViewに表示する際の問題点

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,972

taharasan

score 52

 質問内容

SQLServerストアドプロシージャーを実行し、結果をデータグリッドビュー(dataGridViewRaito)へ表示させようとした際
以下「表示されないパターン(button1_Click)」例の様に、ストアドプロシージャーから読みこんだDataTable(TEMP_dt)内容を、DataSourceに指定してもデータグリッドビューへは何も(フィールド名も)表示されませんでした。

別途「button2_Click」の様に、ストアドプロシージャーから読みこんだDataTable(TEMP_dt)内容を、別のDataSet(ds),DataTable(dt)に入れ直し、DataSourceをdtに指定した際には正常に表示されました。

又、「表示されないパターン(button1_Click)」側デバッグ中に、TEMP_dtの中身を、DataSetビジュアライザーで確認した際には、正常にストアドプロシージャーの結果が表示されている為、データ取得には問題ないと思われます。

何故直接ストアドプロシージャーからの結果を、データグリッドビューへ表示できないのでしょうか?

変数名 内容
dataGridViewRaito 結果表示データグリッドビュー
TEMP_ds テンポラリーデータセット
TEMP_dt テンポラリーデータテーブル
ds 表示表データセット
dt 表示用データテーブル

 該当のソースコード

■表示されないパターン

       private void button1_Click(object sender, EventArgs e)
        {
            //データグリッド初期化
            dataGridViewRaito.DataSource = null;
            dataGridViewRaito.Rows.Clear();
            dataGridViewRaito.Columns.Clear();

            //オートサイズOFF
            dataGridViewRaito.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dataGridViewRaito.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
            dataGridViewRaito.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

            //列が自動的に作成されないようにする
            dataGridViewRaito.AutoGenerateColumns = false;

            CLS_SQL SQLSELECT = new CLS_SQL();
            DataSet TEMP_ds = new DataSet();    //テンポラリーデータセット

            string StoredName = "Stored_Common_View";    //実行ストアド名
            string AccountId = "123456789";//引数
            string BillingYYYYMM = "2018/08";

       //ストアド実行結果取得
            DataTable TEMP_dt = SQLSELECT.func_StoredProceserExec(StoredName, AccountId, BillingYYYYMM);
            TEMP_ds.Tables.Add(TEMP_dt);    //テンポラリーデータテーブル

            //データソースを設定する(dataGridViewRaitoに表示)
            dataGridViewRaito.DataSource = TEMP_dt;//    →★何も表示されない(/ω\)

      //表示更新
            dataGridViewRaito.Update();
            dataGridViewRaito.Refresh();
            dataGridViewRaito.Invalidate();
            dataGridViewRaito.Show();
        }

■表示されるパターン

       private void button2_Click(object sender, EventArgs e)
        {
            //データグリッド初期化
            dataGridViewRaito.DataSource = null;
            dataGridViewRaito.Rows.Clear();
            dataGridViewRaito.Columns.Clear();

            //オートサイズOFF
            dataGridViewRaito.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dataGridViewRaito.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
            dataGridViewRaito.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

            //列が自動的に作成されないようにする
            dataGridViewRaito.AutoGenerateColumns = false;

            CLS_SQL SQLSELECT = new CLS_SQL();
            DataSet TEMP_ds = new DataSet();    //テンポラリーデータセット

            string StoredName = "Stored_Common_View";    //実行ストアド名
            string AccountId = "123456789";//引数
            string BillingYYYYMM = "2018/08";
       //ストアド実行結果取得
            DataTable TEMP_dt = SQLSELECT.func_StoredProceserExec(StoredName, AccountId, BillingYYYYMM);
            TEMP_ds.Tables.Add(TEMP_dt);    //テンポラリーデータテーブル

            //新規にDataSet、DataTableを作り、TEMP_dtからカラム名、データ内容を取得しDataTable再作成
            DataSet ds = new DataSet();        //表示表データセット
            DataTable dt = new DataTable();    //表示用データテーブル

            //TEMPデータテーブルからフィールド一覧の取得
            foreach (DataColumn TEMPcolumn in TEMP_dt.Columns)
            {
                var col = new DataGridViewTextBoxColumn();
                col.HeaderText = TEMPcolumn.ColumnName;
                col.DataPropertyName = TEMPcolumn.ColumnName;
                dataGridViewRaito.Columns.Add(col);
                dt.Columns.Add(TEMPcolumn.ColumnName);  //フィールド名追加
            }
            ds.Tables.Add(dt);    //データテーブルに追加

            //TEMPデータテーブルを読み込み、表示用データテーブルへ追加
            for (int y = 0; y < TEMP_dt.Rows.Count; y++)
            {
                DataRow dr = dt.NewRow();
                for (int x = 0; x < TEMP_dt.Columns.Count; x++)
                {
                    dr[x] = TEMP_dt.Rows[y][x].ToString();
                }
                dt.Rows.Add(dr);
            }

            //データソースを設定する(dataGridViewRaitoに表示)
            dataGridViewRaito.DataSource = dt; //→◎正常に表示される(*'ω'*)

      //表示更新
            dataGridViewRaito.Update();
            dataGridViewRaito.Refresh();
            dataGridViewRaito.Invalidate();
            dataGridViewRaito.Show();
        }

 備考

ストアドプロシージャー結果取得の「SQLSELECT.func_StoredProceserExec」内容は端折っていますが
いずれも結果は取得できています。

 使用ツール

Visual Studio Pro 2017 (C# .NET Framework 4.5.1)
SQL Server 2017

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

表示されないパターンでは DataGridView のカラムを自動的に作らない設定にしたうえで既存のカラムをクリアしています。

表示されるパターンでは同じ設定をしていますが、手動でカラムを作っています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/29 14:46

    表示されないパターンの
    //列が自動的に作成されないようにする
    dataGridViewRaito.AutoGenerateColumns = false;
    を削除したら、dataGridViewへ表示されるようになりました。

    カラムを自動的に作らない=読み込んだデータも反映されない
    のですね。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る