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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

SQL Server

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

11174閲覧

C#でDataSetにSQL Serverのデータベース情報を格納したい

AbcdefgFirst

総合スコア33

C#

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

SQL Server

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2018/01/22 04:37

編集2018/01/22 05:39

こんにちは。
当方、プログラム初心者です。

C#でSQL ServerにあるデータベースをDataSetに格納したいと思い、以下のコードを書きました。

作っている環境はVisual Studio 2017、Windowsフォームアプリケーションを使用しています。

サンプルとして作ったSQL ServerのデータベースはWindows認証でログイン、
テーブル名はdbo.testItem、
商品コード,商品名,価格,単位の4つの列を作りました。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void dbSearch_Click(object sender, EventArgs e) { SqlConnection connection = new SqlConnection("data source ='SQL Serverのサーバ名';initial catalog = 'SQL Serverのデータベース名前'; Integrated Security = True;Connection Timeout = 10;MultipleActiveResultSets = True"); connection.Open(); SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandText = "SELECT 商品コード,商品名,価格,単位 FROM testItem"; DataSet ds = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = command; adapter.Fill(ds); command.Dispose(); connection.Close(); connection.Dispose(); } } }

上記のコードで正しいかと思ったのですが、VisualStudioでデバックボタンを開始した後に、DataSetにカーソルを当ててクイックビューを見ても、空と表示されます。

DataSetを作っただけでは空だから、元のデータベースに合わせてDataSetにも4つの列を含んだテーブルなどを作成する必要があるということでしょうか?
それとも、テーブルは自動で作ってくれて他に間違っているところがあるのでしょうか?

何かおかしい点などがあれば、是非教えて頂きたいです。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/01/22 04:58

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。
guest

回答1

0

ベストアンサー

エラーが出ないのであれば可能性の高そうなものは次の二つです。

1 そのイベントハンドラが呼ばれていない
ボタンの Click イベントに関連付けましょう。
イベントハンドラの行頭にブレークポイントを置いてそこで止まるかどうか確かめましょう。

2 データベースが空
まずデータを入れましょう。

エラーが出るのであればエラーメッセージと行番号がソースのどこにあたるのかを書いてください。

追記

もう一つ。
DataSet がイベントハンドラの中だけで使われています。
このハンドラが終わると破棄されます。
ハンドラの最終行にブレークポイントを置いて確かめてみてください。

追記

データが入っているかどうか MessageBox で出してみましょう。
ついでに using を使って書き換えてみました。
イベントハンドラを次のように書き換えて試してみてください。

C#

1var connectionString = "data source ='SQL Serverのサーバ名';initial catalog = 'SQL Serverのデータベース名前'; Integrated Security = True;Connection Timeout = 10;MultipleActiveResultSets = True"; 2var sqlString = "SELECT 商品コード,商品名,価格,単位 FROM testItem"; 3using (var connection = new SqlConnection(connectionString)) 4using (var command = new SqlCommand() { Connection = connection, CommandText = sqlString }) 5using (var adapter = new SqlDataAdapter() { SelectCommand = command }) 6{ 7 connection.Open(); 8 DataSet ds = new DataSet(); 9 adapter.Fill(ds); 10 MessageBox.Show(ds.Tables[0].Rows.Count.ToString()); 11}

投稿2018/01/22 05:08

編集2018/01/22 08:24
Zuishin

総合スコア28656

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

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

AbcdefgFirst

2018/01/22 07:48

ご回答ありがとうございます。 1 イベントのプロパティを見たところ、Clickイベントに設定されていました。 2 SQL Serverのデータベースはサンプルとして3行ほどデータはあります。  エラーは出ていない様ですが、ボタンをクリックしても反応している感じがしません。 追記 他のクラスを追加してそこにソースを記述した方が良いということでしょうか?
Zuishin

2018/01/22 08:32

値を見ようとした時にイベントハンドラを抜けているんじゃないかという気がしたので途中にメッセージボックスを挟んでみました。 これで一度試してみてください。
Zuishin

2018/01/22 08:33

なお Dispose() や Close() は using を抜けるときに自動的に行われるので不要です。
AbcdefgFirst

2018/01/22 08:51

試したところ、メッセージは「3」と表示されました。
Zuishin

2018/01/22 08:55

ds.Tables[0] に取得したテーブルが入っています。 その Rows にテーブルの行が入っています。 その Count が 3 なのでデータが 3 つ入っているということです。 接続は問題なく、データも入っていました。 空になっていたのは、イベントハンドラを抜けて ds が破棄されてからアクセスしようとしていたのでしょう。 ds にデータが入っていることが確認できたので、これで質問の回答になると思います。
AbcdefgFirst

2018/01/22 09:21

すみません。 メッセージボックスに3と表示されたことで、データセットにデータが格納できたことは理解しました。 ただ、さっき自分が書いたコードのfillメソッドの下に同じようにMessageBoxを書いてみたのですが、「0」と表示されました。 これは自分のコードが、Zuishinさんの仰る「イベントハンドラが抜けてデータセットが破棄された後にアクセスした」という事に当てはまる書き方をしているからだと思うのですが、varやusingを使って書かないとそうなってしまうということでしょうか?
Zuishin

2018/01/22 09:26

いいえ。何かの間違いだと思います。 やっていることは同じですし、取得に失敗すれば例外が生じます。 どこに間違いがあったのかはこちらでは確かめようがありません。 using を使った書き方の方が優れているので、こちらを使ってください。 あえて最初の書き方を選ぶ理由はありません。
AbcdefgFirst

2018/01/22 09:42

見直したところ、SELECT文をコピーしたつもりが一部違っていたようです。お騒がせしました。 ご丁寧に回答頂き、ありがとうございました! 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問