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

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

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

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

SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

3425閲覧

C# SQLサーバーに接続ができない

KIRAA

総合スコア1

C#

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

SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/06/23 04:04

編集2020/06/23 07:04

前提・実現したいこと

未経験からエンジニア職に就いた者です。
現在、新人研修の一環としてC#で「住所録」を作成しています。
実現したいこととして、
・入力フォームに入力した情報を「登録」ボタンを押下したらSQLサーバーに接続して保存する。
というのを実現したいと考えているんですが、各情報を入力し「登録」ボタンを押下した際にシステムが止まってしまい、またどう対処していいかも全く分かりません、。完全に手詰まりとなってしまいましたので質問してみることにしました。

同サイトの似た質問で参考にさせてもらったものがありますのでそちらも記載しておきます。
参考URLサイト
https://teratail.com/questions/166299

拙い文章と不十分な説明は重々承知しております。

お力添えの方よろしくお願いします。

発生している問題・エラーメッセージ

System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。' System.Configuration.ConnectionStringSettingsCollection.this[string].get が null を返しました。

該当のソースコード

C#

1 private void Button1_Click(object sender, EventArgs e) 2 { 3 string No = textBox1.Text; 4 string Name_sei = textBox2.Text; 5 string Name_mei = textBox3.Text; 6 string Postal_code = textBox4.Text; 7 string Address = textBox5.Text; 8 string Tel_no = textBox6.Text; 9 string Mail_address = textBox7.Text; 10 string Create_user = comboBox1.Text; 11 string Create_date = dateTimePicker1.Text; 12 //接続文字列の取得 13 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; 14 15 //データベース接続の準備 16 using (var connection = new SqlConnection(connectionString)) 17 using (var command = connection.CreateCommand()) 18 { 19 try 20 { 21 //データベースの接続開始 22 connection.Open(); 23 24 //SQLの準備 25 command.CommandText = "INSERT INTO Products (No,Name_sei,Name_mei,Postal_code,Address,Tel_no,Mail_address,Create_user,Create_date) VALUES(@No,@Name_sei,@Name_mei,@Postal_code,@Address,@Tel_no,@Mail_address,@Create_user,@Create_date)"; 26 command.Parameters.Add(new SqlParameter("@No", No)); 27 command.Parameters.Add(new SqlParameter("@Name_sei", Name_sei)); 28 command.Parameters.Add(new SqlParameter("@Name_mei", Name_mei)); 29 command.Parameters.Add(new SqlParameter("@Postal_code", Postal_code)); 30 command.Parameters.Add(new SqlParameter("@Address", Address)); 31 command.Parameters.Add(new SqlParameter("@Tel_no", Tel_no)); 32 command.Parameters.Add(new SqlParameter("@Mail_address", Mail_address)); 33 command.Parameters.Add(new SqlParameter("@Create_user", Create_user)); 34 command.Parameters.Add(new SqlParameter("@Create_date", Create_date)); 35 36 //SQLの実行 37 command.ExecuteNonQuery(); 38 39 } 40 finally 41 { 42 //データベースの接続終了 43 connection.Close(); 44 } 45 } 46 47 48 }

試したこと

調べていく中にapp.config?などがありましたが理解できなかったのでそのまま触っていません。

補足情報(FW/ツールのバージョンなど)

VisualStudio2017
MicrosoftSQLServer2017

追記

下記コードのthrow;でシステムが止まっています。
「ハンドルされていない例外」
System.Data.SqlClient.SqlException: 'オブジェクト名 'Products' が無効です。'

C#

1catch (Exception exception) 2 { 3 Console.WriteLine(exception.Message); 4 throw; 5 }

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

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

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

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

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

dodox86

2020/06/23 04:13

未経験の新人さんへの研修にしては敷居の高い課題に思えますね。この手のご質問への定番の確認になるのですが、研修ということで講師や仲間に聞く、と言うことはできないのでしょうか。
KIRAA

2020/06/23 04:27

返信ありがとうございます。 そうですね、今春18で会社に入社して同期も0で自分だけの環境なので仲間に聞くというのは選択肢にありません、また上司の方々は聞けば話をしてくれるのですが、その話というのは前提知識のある人用の話で自分にはわからない内容です、。この作業も「VisualStudioで調べながら進めて」といった感じでコードの書き方や決まり事も教わっていないので自分の調べた中だけの独学状態です、。
guest

回答3

0

ベストアンサー

アプリケーションの形態が「Windows Forms」を前提としての回答です。(他の形態でも大差ないですが)

App.configとは「アプリケーション構成ファイル」と呼び、アプリに固有の各種の情報を収めたXML形式のファイルです。ConfigurationManager(System.Configuration.ConfigurationManager)と言うクラスのメソッドを介すると、このファイル中のデータにアクセスできるよう、あらかじめ.NET環境で用意されています。実際に使うには、まずApp.configファイルをVisual Studioのプロジェクトに追加する必要があります。C#やVB.NET、.NET Frameworkの情報サイトとしては老舗のdobon.netさんの以下の記事を読んで、まず、App.configを追加し、使えるようにしましょう。

アプリケーション構成ファイル」を使用して設定を読み込む - dobon.net

次に、追加したApp.configを例えば以下のように修正、追加します。

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<configuration> 3 <connectionStrings> 4 <add name="sqlsvr" 5 providerName="System.Data.SqlClient" 6 connectionString="Server=.\MSSQLSERVER2017;Database=Test;Integrated Security=SSPI;"/> 7 </connectionStrings> 8</configuration>

<add name="sqlsvr"の部分は質問者さんの下の提示コードに合わせています。
var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;

これで読めるようになります。

C#

1private void Button1_Click(object sender, EventArgs e) 2{ 3 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; 4 System.Diagnostics.Debug.WriteLine("connectionString=" + connectionString); 5 /* Visual Studio の「出力」ウィンドウに以下のように出力される。 6 connectionString=Server=.\MSSQLSERVER2017;Database=Test;Integrated Security=SSPI; 7 */ 8}

connectionStringの部分は、実際に質問者さんの環境でSQL Serverに接続させるために適切な値をセットする必要があります。このファイルは、プログラムの実行時に実行ファイルと同じディレクトリ(フォルダー)下に「(実行ファイル名.config」とのような名前で配置されます。例えば実行ファイル名が「WindowsFormsApp1.exe」ならば、「WindowsFormsApp1.exe.config」になります。

ご質問内容を読む限り、この設定値が読めない(設定がされていない)ためにSystem.NullReferenceExceptionが発生していると踏んで回答しました。勝手な意見ですが、App.configのような設定ファイルを読むこと自体は「C#で住所録を作る」課題からするとそれほど高い優先度ではないように思います。むしろSQL Serverへのアクセスや住所録表示、編集、保存などのような本質的な処理の方がはるかに難しいでしょう。他回答でもご提案いただいたように、まずはstringで固定文字列にして確実にSQL Serverにアクセスできるようにすることを先決とするなど、優先度を考えて作業すると、少しでもストレス無く進められるかもしれません。

尚、本回答ではdobon.netさんの情報をご案内しましたが、マイクロソフトの公式の情報は常に、併せてチェックするようにしましょう。

投稿2020/06/23 06:13

dodox86

総合スコア9183

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

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

KIRAA

2020/06/23 06:59

コメントありがとうございます。 とても分かりやすい説明で助かりました! しつこい様で申し訳ないのですが、当初わからなかったエラーについては無事抜けれたんですけど、次はもう少し下の行で止まってしまいました、。 少し調べましたがやっぱりわかりませんでした、お手数をおかけしますが何卒よろしくお願いいたします。 詳細につきましては追記しておきます!
dodox86

2020/06/23 07:02

> 次はもう少し下の行で止まってしまいました、。 本来、質問は当初からのひとつのみであり、それを解決したことで新たに出るエラーや問題はその質問に追加するべきではありません。回答者の負担になります。
dodox86

2020/06/23 07:05 編集

まぁ、質問の件名がもともと「C# SQLサーバーに接続ができない」なので、即、NGと言うわけでもなく、範囲としては微妙ではありますが。
KIRAA

2020/06/23 07:08

申し訳ありませんでした。 当初のエラーは解決したのでもう少し自分の力で頑張ってみようと思います。 とても分かりやすい説明をありがとうございました!
dodox86

2020/06/23 07:10

追記分を拝見しました: SQL Serverに接続はできているんじゃないですか?(<そうならば、厳密に言えば質問としては終わっています) > System.Data.SqlClient.SqlException: 'オブジェクト名 'Products' が無効です。' Productsテーブルは存在するのでしょうか。まず、SQL Server Management Studio などでSQLが正しく発行できるかを確認してください。
guest

0

App.Config から接続文字列を読み込む方法は

「接続文字列と構成ファイル」
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/connection-strings-and-configuration-files

中段あたりにある「例:接続文字列を名前で取得する」を参照してください。

ConnectionString の内容は

「SqlConnection.ConnectionString Property」
https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring

「SqlConnection.ConnectionString プロパティ」
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring

上は英語ページ、下は日本語のページですが、日本語のページはパラメータ名も翻訳されちゃっているので比較しながら読むといいと思います。

投稿2020/06/23 05:54

KOZ6.0

総合スコア2626

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

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

KIRAA

2020/06/23 06:53

コメントありがとうございます。 参考サイトありがとうございます!調べていた時に難しい、と読み飛ばしていたサイトでした、。 仕組みというか根本的な部分が少しわかった気がします!
guest

0

冷たい会社ですね。まあ、「自分で這い上がれ」って感じですかね。

var connectionString = @"Data Source=データベース名;Initial Catalog=接続するテーブル名;Connect Timeout=60;Persist Security Info=True;User ID=ユーザーID;Password=パスワード";

あなたが書いた
var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
を上記のように修正しましょう。

頑張ってください。

投稿2020/06/23 05:19

senior_golfer

総合スコア264

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

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

KIRAA

2020/06/23 06:05

コメントありがとうございます。 IDとパスワードなんですが自分はWindows認証?なのでそういった書き方ができないんですがその際にはどうしたらいいのでしょうか、。的外れなことを言っているようであればまた指摘のほどよろしくお願いします! 自分もかなりこの会社がしんどくなってきているのが正直なところです、笑
KIRAA

2020/06/23 07:09

丁寧にありがとうございます! 練習も兼ねているのでこちらのやり方でもやってみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問