静态类asp.net mvc中的一个静态变量
本文关键字:一个 静态 变量 net asp mvc 静态类 | 更新日期: 2023-09-27 18:17:05
我有一个静态类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;
}
}
:
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;
}
}