2016-03-29 7 views
0

DataBaseServiceクラスインスタンス経由でUserExistsメソッドを呼び出すと、すぐにデータベースに接続できません。 SqlConnectionに接続文字列を指定したにもかかわらず、インスタンスはnullです。データベースへの接続時にNull参照例外

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

namespace Somename 
{ 
    public class DataBaseService 
    { 
     // Setting up the Database Services 
     private SqlConnection myConnection; 
     private const string ConnectionString = "Data Source=Test-LAPTOP\\MSSQLSERVER1;Initial Catalog=myDatabaseTest;Integrated Security=True"; 

     private static readonly DataBaseService _instance; 

     static DataBaseService() 
     { 
      _instance = new DataBaseService(); 
      Initilize(); 
     } 

     public static DataBaseService Instance; 
     private static void Initilize() 
     { 
      try 
      { 
       Instance.myConnection = new SqlConnection(ConnectionString); 
       Instance.myConnection.Open(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error while connecting to DB: " + ex.Message); 
       return; 
      } 
     } 

     public bool UserExists(string username) 
     { 
      var myQuery = "Select * from UserProfile where userId ="+username+""; 
      SqlCommand sqlCmd = new SqlCommand(myQuery, Instance.myConnection); 
      sqlCmd.CommandType = CommandType.Text; 
      //sqlCmd.CommandText = "Select * from Customers"; 
      SqlDataAdapter sqlDataAdap = new SqlDataAdapter(sqlCmd); 

      DataTable dtRecord = new DataTable(); 
      sqlDataAdap.Fill(dtRecord); 

      if (dtRecord == null) 
      { 
       return false; 

      } 
      else 
      { 
       return true; 
      } 
     } 
    } 
} 
+0

それはあなたのように見えますなぜそれがnullであるのかを説明する 'Instance'は割り当てられませんでした。 – Quantic

+1

[NullReferenceExceptionとは何か、どうすれば修正できますか?](http://stackoverflow.com/questions/4660142/what-is-a- nullreferenceexception-and-ho –

+0

接続文字列を指定しても、接続インスタンスは作成されません。 – Plutonix

答えて

1

あなたはあなたのコード、_instanceInstanceDataBaseServiceの2つのインスタンスを持っています。静的コンストラクタで_instanceを初期化しますが、Instanceを決して初期化しません。

あなたはおそらくどこでもあなたが現在Instanceを使用している、と完全にInstanceを取り除く_instanceを使用したい:

... 

private static readonly DataBaseService _instance; 

static DataBaseService() 
{ 
    _instance = new DataBaseService(); 
    Initilize(); 
} 

private static void Initilize() 
{ 
    try 
    { 
     _instance.myConnection = new SqlConnection(ConnectionString); 
     _instance.myConnection.Open(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error while connecting to DB: " + ex.Message); 
     return; 
    } 
} 

... 
0

あなたはこのパターンに従うことをお勧めします:

private static DataBaseService _instance; 
// public property 
public static DataBaseService Instance 
{ 
    get 
    { 
     return _instance ?? (_instance = new DataBaseService()); 
    } 
} 
+1

OPのコードがなぜ失敗しているのか、それからパターンを提案する理由について何らかの説明があれば、これはすばらしい答えになります。 –

+0

これは当てはまりますが、尋ねられた質問にはまったく対応していません –

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 11818362) – RoadieRich