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

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

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

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

SQL Server

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

Q&A

解決済

1回答

3192閲覧

【C#】SQLServerの接続とSQLの実行を別クラスで行いたい

chimi_mamire

総合スコア12

C#

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

SQL Server

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

0グッド

0クリップ

投稿2020/01/17 02:36

前提・実現したいこと

クラス1でSQLServerの接続を行う
→クラス2のメソッドに移動
→クラス2でSQLを実行
→クラス1でSQLの接続を切る

発生している問題・ソースコード

http://okwakatta.net/code/ado05.html

上記のサイトを参考に、SQLServerの接続/データの取得をするプログラムを書こうとしています。

サイトでは接続/SQL文の実行/接続解除を1つのメソッドで行っていますが、

接続/接続解除→Class1
SQL実行→Class2

のように別々で行うことは可能でしょうか。

下記のコードでは接続/接続解除は可能ですが、SQL文の実行が実現できていません。

(Class2.MethodSQLのcommand.Connection = ConnectDB.Connection;がNullになっているため)

解決方法または別の良い方法がありましたら、恐れ入りますがご教示お願い致します。

### [Class1] public SqlConnection Connection { get; set; } public void ConnectDB() {   SqlConnection Connection = null;   var getDate = new GetData();   var connectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;      try {   Connection = new SqlConnection(connectionString);  Connection.Open(); Class2.MethodSQL(this); } catch (Exception exception) {     Console.WriteLine(exception.Message); throw; } finally { Connection.Close(); } }
### [Class2] public void MethodSQL(ConnectDB connectDB) {   SqlCommand command = new SqlCommand();   command.CommandText = "SELECT * FROM Table1";   command.Connection = ConnectDB.Connection;   SqlDataReader reader = command.ExecuteReader(); 以下省略 }

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

使用しているツールは以下の通りです。

SQLServer2014
VisualStudio2017

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

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

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

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

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

workaholist

2020/01/17 02:59

そもそもこれ、ビルド通らないですよね?
chimi_mamire

2020/01/17 04:28

コメントありがとうございます。 Class2のSqlDataReader reader = command.ExecuteReader();の部分をコメントアウトする前のものを張り付けてしまいました。 コメントアウト後のものはビルドが通るようになっています。 こちらの不手際で手間を取らせてしまい申し訳ありません。
workaholist

2020/01/17 06:50

Class1クラスでConnectionがプロパティとローカル変数で2重定義されていたり、 ConnectDBはpublic void ConnectDB()なのでメソッドかと思いきや、public void MethodSQL(ConnectDB connectDB)とあるのでクラスっぽかったり、 GetDataってなんだとか、 ConnectDB.ConnectionじゃなくてconnectDB.Connectionでしょうとか、 そういうところでビルド通りません。
guest

回答1

0

ベストアンサー

変数等のスコープについて学習するべきかと思います。

Class1の

C#

1Class2.MethodSQL(this);

の部分にブレイクポイントを設定し、ここで
this.ConnectionConnectionを比べてみてください。

投稿2020/01/17 02:50

YAmaGNZ

総合スコア10242

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

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

chimi_mamire

2020/01/17 03:01

回答ありがとうございます。勉強不足で申し訳ありません…。 Class2.MethodSQL(this);とConnectionを比較してみると、 thisの中にあるConnectionはnullになっていました。 一方でConnectionにはDB接続の情報など複数の情報が入っていました。
YAmaGNZ

2020/01/17 03:07

ご自身で確かめられたとおり、同じ名前であっても変数を定義する場所が違えば別物となります。 今回の場合ですと、 ConnectDB関数の内部で定義した「Connection」とClass1のプロパティの「Connection」プロパティは別物として扱われます。 Class2からはClass1のConnectionプロパティを見ていることになります。
chimi_mamire

2020/01/17 04:56

Class1の"SqlConnection Connection = null;"で再度定義したから、Class1のプロパティの「Connection」と別物になってしまったんですね…。 SqlConnectionの部分を外したら、Class2に「Connection」プロパティの情報が入るようになりました。 お付き合いいただいて本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問