c# - 静态类asp.net mvc中的静态变量

标签 c# asp.net .net asp.net-mvc razor

我有一个静态类数据:

 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,要么在使用它之前不对其进行初始化。

最有可能的是,一个类调用 Disconnectconnexion 设置为 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())

关于c# - 静态类asp.net mvc中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16920480/

相关文章:

c# - 如何在另一个旁边显示动态创建的 DIV?

c# - 为什么包含 XML header 时 C# XmlDocument.LoadXml(string) 会失败?

c# - 如何解析 xs :annotation from the xs:choice using the System. Xml.Schema

c# - 中继器未获取客户端更新的项目

asp.net - 为什么我的 webservice 方法会通过 GET 调用?

c# - 如何根据当前日期时间发现财政年度?

c# - 如何将 ulong 转换为正 int?

c# - 调整图像的亮度对比度和 Gamma

c# - 我应该使用 '==' 进行 .NET 本地化字符串比较吗?

c# - 当用户取消文件覆盖时出现 Excel COMException 0x800A03EC