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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

1443閲覧

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

taharasan

総合スコア55

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2018/09/29 05:27

質問内容

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表示用データテーブル

該当のソースコード

###■表示されないパターン

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 //データグリッド初期化 4 dataGridViewRaito.DataSource = null; 5 dataGridViewRaito.Rows.Clear(); 6 dataGridViewRaito.Columns.Clear(); 7 8 //オートサイズOFF 9 dataGridViewRaito.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; 10 dataGridViewRaito.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; 11 dataGridViewRaito.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; 12 13 //列が自動的に作成されないようにする 14 dataGridViewRaito.AutoGenerateColumns = false; 15 16 CLS_SQL SQLSELECT = new CLS_SQL(); 17 DataSet TEMP_ds = new DataSet(); //テンポラリーデータセット 18 19 string StoredName = "Stored_Common_View"; //実行ストアド名 20 string AccountId = "123456789";//引数 21 string BillingYYYYMM = "2018/08"; 22 23       //ストアド実行結果取得 24 DataTable TEMP_dt = SQLSELECT.func_StoredProceserExec(StoredName, AccountId, BillingYYYYMM); 25 TEMP_ds.Tables.Add(TEMP_dt); //テンポラリーデータテーブル 26 27 //データソースを設定する(dataGridViewRaitoに表示) 28 dataGridViewRaito.DataSource = TEMP_dt;// →★何も表示されない(/ω\) 29 30   //表示更新 31 dataGridViewRaito.Update(); 32 dataGridViewRaito.Refresh(); 33 dataGridViewRaito.Invalidate(); 34 dataGridViewRaito.Show(); 35 }

###■表示されるパターン

C#

1 private void button2_Click(object sender, EventArgs e) 2 { 3 //データグリッド初期化 4 dataGridViewRaito.DataSource = null; 5 dataGridViewRaito.Rows.Clear(); 6 dataGridViewRaito.Columns.Clear(); 7 8 //オートサイズOFF 9 dataGridViewRaito.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; 10 dataGridViewRaito.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; 11 dataGridViewRaito.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; 12 13 //列が自動的に作成されないようにする 14 dataGridViewRaito.AutoGenerateColumns = false; 15 16 CLS_SQL SQLSELECT = new CLS_SQL(); 17 DataSet TEMP_ds = new DataSet(); //テンポラリーデータセット 18 19 string StoredName = "Stored_Common_View"; //実行ストアド名 20 string AccountId = "123456789";//引数 21 string BillingYYYYMM = "2018/08"; 22       //ストアド実行結果取得 23 DataTable TEMP_dt = SQLSELECT.func_StoredProceserExec(StoredName, AccountId, BillingYYYYMM); 24 TEMP_ds.Tables.Add(TEMP_dt); //テンポラリーデータテーブル 25 26 //新規にDataSet、DataTableを作り、TEMP_dtからカラム名、データ内容を取得しDataTable再作成 27 DataSet ds = new DataSet(); //表示表データセット 28 DataTable dt = new DataTable(); //表示用データテーブル 29 30 //TEMPデータテーブルからフィールド一覧の取得 31 foreach (DataColumn TEMPcolumn in TEMP_dt.Columns) 32 { 33 var col = new DataGridViewTextBoxColumn(); 34 col.HeaderText = TEMPcolumn.ColumnName; 35 col.DataPropertyName = TEMPcolumn.ColumnName; 36 dataGridViewRaito.Columns.Add(col); 37 dt.Columns.Add(TEMPcolumn.ColumnName); //フィールド名追加 38 } 39 ds.Tables.Add(dt); //データテーブルに追加 40 41 //TEMPデータテーブルを読み込み、表示用データテーブルへ追加 42 for (int y = 0; y < TEMP_dt.Rows.Count; y++) 43 { 44 DataRow dr = dt.NewRow(); 45 for (int x = 0; x < TEMP_dt.Columns.Count; x++) 46 { 47 dr[x] = TEMP_dt.Rows[y][x].ToString(); 48 } 49 dt.Rows.Add(dr); 50 } 51 52 //データソースを設定する(dataGridViewRaitoに表示) 53 dataGridViewRaito.DataSource = dt; //→◎正常に表示される(*'ω'*) 54 55      //表示更新 56 dataGridViewRaito.Update(); 57 dataGridViewRaito.Refresh(); 58 dataGridViewRaito.Invalidate(); 59 dataGridViewRaito.Show(); 60 } 61

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

使用ツール

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2018/09/29 05:41

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taharasan

2018/09/29 05:46

表示されないパターンの //列が自動的に作成されないようにする dataGridViewRaito.AutoGenerateColumns = false; を削除したら、dataGridViewへ表示されるようになりました。 カラムを自動的に作らない=読み込んだデータも反映されない のですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問