У меня есть статический класс данных:Статическая переменная в статическом классе 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;
}
}
в акции 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
во второй функции, несмотря на это статическая переменная в статическом классе !! !
В чем причина этого изменения? Как я могу это исправить?
пытается провести ' SqlConnection' открывается в статическом поле, вероятно, является плохой идеей по ряду причин. Скорее всего, это «нуль», потому что он утилизируется после его первого использования. Просто создайте новый 'SqlConnection', когда вам это нужно, и немедленно отпустите его. Не пытайтесь удерживать ресурсы SQL на неопределенный срок. – David
@ Давид +1, очень, очень плохая идея. –
'using (Data.connexion)' - как только ваш первый потребитель использует его, соединение закрывается и удаляется. Как говорит Дэвид, не держите свое соединение - откройте его, когда вам это нужно, закройте его, когда закончите, и не пытайтесь реализовать свой собственный «пул» подключения. – GalacticCowboy