質問内容
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/29 05:46