3

私は静的クラス Data を持っています:

 public static class Data
    {
        public static SqlConnection connexion;


        public static bool  Connect()
        {
                System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
                builder["Initial Catalog"] = "Upload";
                builder["Data Source"] = "base";
                builder["integrated Security"] = true;
                string connexionString = builder.ConnectionString;
                connexion = new SqlConnection(connexionString);
                try { connexion.Open(); return true; }
                catch { return false; }

        }
        public static  void Disconnect()
        {
            if (connexion != null) connexion.Close();
            connexion = null;
        }

 }

アクション Home で:

  public ActionResult Home()
        {
            Data.Connect();
            if (CompteModels.Connected)
            {
                ArrayList model = new ArrayList();

                ClientModels clients = new ClientModels();
                model.AddRange(clients.Client_List());

                AdminModels admins = new AdminModels();
                model.AddRange(admins.Admin_List());


                return View(model);
            }

            else return RedirectToAction("Login", "Account");
}

クライアントクラス:

 public List<ClientModels> Client_List()
        {
            List<ClientModels> l = new List<ClientModels>();

            using (Data.connexion)
            {

                string queryString = @"select Login, Password, Mail, Name, Tentatives from Compte where User_type_id in ( select Id from User_type where Fonction = 'Client')";

                SqlCommand command = new SqlCommand(queryString, Data.connexion);


                try
                {
                    SqlDataReader reader = command.ExecuteReader();


                    do
                    {

                        while (reader.Read())
                        {
                            ClientModels admin = new ClientModels { Login = reader.GetString(0), Password = reader.GetString(1), Mail = reader.GetString(2), Name = reader.GetString(3), Tentatives = reader.GetInt32(4)  };
                            l.Add(admin);


                        }
                    } while (reader.NextResult());

                    return l;



                }
                catch { return null; }

            }

関数のAdminList場合、実装は同じですClient_Listが、クラス内にありAdminます。

問題は静的変数にありますconnexion:最初の関数でClient_Listはその値は正しく、クライアントのリストを取得しますがnull、静的クラスの静的変数であるにもかかわらず、2番目の関数になります!!!

この変更の理由は何ですか? どうすれば修正できますか?

4

3 に答える 3

4

どこかに設定connexionしているか、使用する前に初期化していません。null

Disconnectほとんどの場合、1 つのクラスが null に設定されている呼び出しを行っていconnexionますが、別のクラスはそれが null ではないと想定して使用しようとしています。

コメントで述べたように、のようなリソースへの静的参照を保持することSqlConnectionはお勧めできません。コードを再利用したい場合は、新しいインスタンスを返す静的関数を作成して接続文字列を静的にすることができますが、Web サイト全体で共有されている接続への静的参照を使用すると、より多くの問題が発生します (あなたがすでに見ているように)。 SqlConnection

静的関数でそれを行う 1 つの方法は次のとおりです。

public static SqlConnection GetConnection()
{
    System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
    builder["Initial Catalog"] = "Upload";
    builder["Data Source"] = "base";
    builder["integrated Security"] = true;
    string connexionString = builder.ConnectionString;
    connexion = new SqlConnection(connexionString);

    return connexion; 
}

クライアント コードは次のようになります。

using (SqlConnection conn = Data.GetConnection())
于 2013-06-04T14:36:32.687 に答える
0

他の人がすでに述べたように、これは悪い考えです。

必要に応じて接続を作成して開き、後で破棄する必要があります。

using (SqlConnection connection = new SqlConnection(connectionString)) 
{    
    connection.Open();
    // ... now use it
}

もちろん、このメカニズムを隠す他のパターンもありますが、あなたの場合はやり過ぎかもしれません。

于 2013-06-04T14:39:30.873 に答える
0

using ステートメントは、IDisposable インターフェイスを使用して接続を破棄します

 public List<ClientModels> Client_List()
 {
      List<ClientModels> l = new List<ClientModels>();

      using (Data.connexion) <--- here
}

これを変更して新しい接続を作成します

 public List<ClientModels> Client_List()
 {
      List<ClientModels> l = new List<ClientModels>();

      using (var connection = Data.CreateConnexion())
}

これに似ている

 public static class Data
 {
     public static SqlConnection CreateConnection()
     {
        System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
            builder["Initial Catalog"] = "Upload";
            builder["Data Source"] = "base";
            builder["integrated Security"] = true;
            string connexionString = builder.ConnectionString;
            var connexion = new SqlConnection(connexionString);
            connexion.Open(); 
            return connexion; 

     }
 }
于 2013-06-04T14:39:50.483 に答える