[英]A static variable in static class 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
,盡管它是靜態類中的靜態變量!
這種改變的原因是什么? 我該如何解決?
您要么在某處將connexion
設置為null
,要么在使用它之前不將其初始化。
最有可能的是,一個類調用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())
正如其他人已經提到的那樣,這是一個壞主意。
您只需在需要時創建並打開連接,然后再將其處理:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// ... now use it
}
當然,還有其他模式,隱藏這種機制,但在你的情況下可能是矯枉過正。
您的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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.