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

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

ただいまの
回答率

89.20%

C# DataTableに読み込んだデータがない

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,526

k_mail

score 83

タイトル悪いと思います。

C# で SQL Server から SELECT文 の 実行結果 を 取得する 方法
上記のサイトを参考に
C#でデータベースに接続し、データを取得したいです。
予想では、 
adapter.Fill(table);
のtable内にデータがあるのかなと思ったのですが、
特に対象と思われるデータがありませんでした。

お手数をお掛け致しますが、
どのようにすれば、データを取得できるかご教示頂きたいです。
(テーブルの情報をどこかにArryリストとして保持しているのかなと思っていたのですが違うようです。。)

[運送会社]テーブル
|運送コード|運送会社|電話番号|
|1            |アカネコ|(03) 3955-98xx|
|2            |トマト   |(03) 3681-31xx|
|3            |ペンギン |(03) 3566-99xx|

【画像です。】
行数は確認できるがデータ内容が確認できない

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace チュートリアル_
{
    class DBConect
    {
        //まとめて読み込む (DataTable)
        public DataTable GetData()
        {
            var table = new DataTable();

            // 接続文字列の取得
            var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;

            using (var connection = new SqlConnection(connectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {
                    // データベースの接続開始
                    connection.Open();

                    //http://lifesiz.com/adsense/?p=30
                    // SQLの設定
                    command.CommandText = @"use POSDB SELECT * FROM 運送会社";

                    // SQLの実行
                    var adapter = new SqlDataAdapter(command);
                    adapter.Fill(table);
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                    throw;
                }
                finally
                {
                    // データベースの接続終了
                    connection.Close();
                }
            }

            return table;
        }    
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2018/12/15 14:11

    Rows のある次の行にブレークポイントを設定し、止まったところで Rows をポイントすれば中のデータを見ることができます。

    キャンセル

  • SurferOnWww

    2018/12/15 14:51

    > データの中身をどこかのオブジェクトか変数にもっていくと、データの値を見ることができるのかなと思っていました。

    デバッガで見たいのであれば DataTable を開いて Rows を開いて「結果ビュー」を開くと見ることができると思います。後で調べて画像を貼っておきます。

    キャンセル

  • k_mail

    2018/12/15 15:37

    Zuishinさん
    SurferOnWwwさん

    中身見ることができました!!
    お付き合い頂きありがとうございました。

    キャンセル

回答 5

checkベストアンサー

+4

目で見たいということであれば DataTable を DataGridView にバインドして表示してはいかがでしょう?

以下のようなコードで、

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form8 : Form
    {
        private DataGridView dataGridView1;
        private BindingSource bindingSource1;

        public Form8()
        {
            InitializeComponent();

            this.dataGridView1 = new DataGridView();
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.bindingSource1 = new BindingSource();
            this.dataGridView1.DataSource = this.bindingSource1;
            this.Controls.Add(this.dataGridView1);

            this.bindingSource1.DataSource = GetEmployeeDataTable();
        }

        private DataTable GetEmployeeDataTable()
        {
            string connString = @"Data Source=(local)\sqlexpress;Initial Catalog=NORTHWIND;Integrated Security=True";
            string query = "SELECT [EmployeeID],[LastName],[FirstName],[Address] FROM [Employees]";
            DataTable table = new DataTable();

            using (SqlConnection connection = new SqlConnection(connString))
            {
                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter(command);
                    adapter.Fill(table);
                }
            }

            return table;
        }
    }
}

以下の結果になります。

イメージ説明

表題とは直接関係ない話ですが、DataAdapter.Fill メソッドを使う場合は Open, Close は書かなくても OK です。

【追伸】

質問に対する 2018/12/15 14:51 の私のコメントで「デバッガで見たいのであれば DataTable を開いて Rows を開いて「結果ビュー」を開くと見ることができると思います。後で調べて画像を貼っておきます」と書きましたが、その画像を以下に貼っておきます。お試しください。

イメージ説明

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

DataTable にどういうメソッドとプロパティがあるか調べてみてください。
取得に成功していれば Rows でアクセスできます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

解決済みの質問でなんですが、回答への返答などを見ていると多分やりたかったのはこれかなと思うので

VisualStudioのデバッグ中に手軽に見たいだけならビジュアライザを使えばいいと思います。
止めた際に変数をポイントするかウォッチなどで変数の値を見れますが、一部のデータ型はビジュアライザを使用してみることができます。
対応したビジュアライザがある場合は虫眼鏡アイコンが表示されますのでアイコンクリックでウィンドウが開いて表示できます。

変数をポイントして虫眼鏡をクリックでびじゅあらいざ

Stringだとそのままコピペできる文字列で表示されますし、ウォッチで見るのは面倒だけどビジュアライザが無い、または良い感じにコピペもできないのかよ!と思った場合はMicrosoft.VisualStudio.DebuggerVisualizersの
DialogDebuggerVisualizerを継承したクラスを自作してデータによってはVisualizerObjectSourceを継承したクラスで加工するなどして表示することも可能です
表示はFormでもWPFでも可能ですので作りやすい方で

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/15 20:33

    len_soukoさん
    ご回答ありがとうございます。

    非常に簡単にテーブル形式で表示されますね!!!
    こんな便利な機能付いていたんですね。。
    ありがとうございます!!!!!

    キャンセル

+1

実行しているSQLをSQL Management Studio等で実行してみてください。
どのようなデータを取得するか確認できるはずです。

逆に、SQLをSQL Management Studio等で希望のデータとなるSQLをプログラム側で実行するようにしてください。

追記

こちらを参照してみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/15 11:16

    ご回答ありがとうございます。
    adapter.Fill(table);を
    adapter.Fill(table.Rows[0]);に変更すると、
    「エラー CS1503
     引数 1: は 'System.Data.DataRow' から 'System.Data.DataSet' へ変換することはできません。」
    と表示され、ビルドが通らなくなります。

    ----
    https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/dataset-datatable-dataview/viewing-data-in-a-datatable
    も確認しましたが、
    adapter.Fill(table);を
    adapter.Fill(table.Select);
    に変更してみましたが、
    「エラー CS1503 引数 1: は 'メソッド グループ' から 'DataSet' へ変換することはできません。」
    となり、
    ビルドが通らないですね。。。

    ---
    ちなみに、現場では、
    直接、DataTableにセットする方がメジャーなのでしょうか。
    (データ件数が1万件とかの場合も含め。)

    キャンセル

  • 2018/12/15 12:51

    どこにそのようなコードがありましたか?


    >ちなみに
    要件次第ではないでしょうか

    キャンセル

+1

発行しているSQL文が SELECT * FROM 運送会社 ではなく SELECT count(*) FROM 運送会社 なので件数が帰ってくるだけでデータがとれない、というオチではないですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/15 09:57

    ご回答ありがとうございます。
    SELECT * FROM 運送会社
    に変更致しました。
    3と件数は出たのですが、
    データ内容は確認できません。
    どのようにすると確認できるでしょうか。

    キャンセル

  • 2018/12/15 09:59

    画像を添付致しました。
    因みに、table.Rows.Listの中身はnullでした。

    キャンセル

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

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

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