2013-06-04 48 views
3

我有一个静态类数据:在静态类asp.net的MVC静态变量

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; 
     } 

} 
在行动主页

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在第二个功能,尽管它是在静态类的静态变量! !

这种改变的原因是什么?我该如何解决它?

+9

试图抓住一个'出于多种原因,在静态字段中打开SqlConnection'可能是个坏主意。最有可能的是'空',因为它在第一次使用后被处置。只需在需要时创建一个新的'SqlConnection',然后立即释放它。不要试图无限期地坚持SQL资源。 – David

+2

@David +1,一个非常非常糟糕的主意。 –

+1

'使用(Data.connexion)' - 只要您的第一个消费者使用它,连接关闭并处理。正如David所说,不要保持连接 - 在需要时打开它,在完成时关闭它,并且不要尝试实现自己的连接“池”。 – GalacticCowboy

回答

4

您在设置connexionnull某处或者在使用它之前没有初始化它。

最有可能的是,一个类别调用Disconnect,它将connexion设置为null,而另一个类别假定它不为null并尝试使用它。

正如在评论中提到的,保持对像SqlConnection这样的资源的静态引用不是一个好主意。如果你想重新使用的代码,你可以创建一个静态功能返回一个SqlConnection实例,使连接字符串静态的,但有一个静态引用到的份额在整个网站会给出一个连接你更多的问题是值得的(正如你已经看到的)。

一种方法做一个静态函数是:

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()) 
0

这是一个糟糕的主意,因为别人已经说过。

您应该简单地创建并在需要时打开一个连接,事后处置它:

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

当然,还有其他的模式,即隐藏这种机制,但可能会在你的情况是矫枉过正。使用IDisposable接口

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

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

更改了连接的

0

你使用的语句部署此创建一个新的连接

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; 

    } 
}