使用这个静态类的潜在问题是什么

本文关键字:问题 问题是 是什么 静态类 | 更新日期: 2023-09-27 17:57:46

这是我的示例代码:

public static class MySqlHelper
{
    private static string constring = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
    public static int ExecuteNonQuery(string mysqlquery)
    {
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand(mysqlquery, conn);
        int result;
        try
        {
            conn.Open();
            result= cmd.ExecuteNonQuery();
        }
        finally
        {
            conn.Close();
        }
        return result;
    }
}

用法:MySqlHelper.ExecuteNonQuery("select * from customers");

我想知道使用这个静态类的问题

我可以像这里提到的那样更改我的课程,但我已经在几个网站上使用了这个课程,我需要几天的时间在每个地方更改并测试它。

感谢您的意见。

编辑:更新了代码。这会对提供的答案产生影响吗?对不起,我一开始就应该发的。

使用这个静态类的潜在问题是什么

我假设连接字符串在执行过程中不会更改(您可能希望将其设为只读)。由于问题中没有显示其他共享状态,因此不存在真正的问题。

然而,如果您有任何共享状态,那么您就有一个巨大的线程问题。如果您共享了连接,则会遇到更大的问题。

但正如所写的,没有显著的静态字段:没有问题。

我觉得他回答得很清楚。

在ASP.NET 中编写我自己的提供者类

"请记住,所有用户都将在同一个实例中共享连接,这可能会导致严重问题…"

静态类很难测试。

你的问题提到,要想改变,你必须在几个网站上改变课程。如果你的网站与一个接口耦合,那么交换实现将相对简单。

在我自己的项目中,我避免使用公共静态类。它们很快就会变得笨重。

因此,这不成问题,这取决于您如何使用此类,理想情况下,它是抽象工厂模式的一部分,具有静态连接,以便在整个应用程序中使用相同的连接,但具有executerader和其他方法等方法不是一个好选择。类似地,总是检查连接是否未关闭或使用前的状态,因为如果您使用静态连接,并且您使用executereader的语法,则它将关闭连接,如果其他方法在此之后使用连接,则它会得到错误

明显的缺点是:

  • 硬编码连接字符串
  • 如果驱动程序中没有连接池,这将非常糟糕://open-conn+/close-conn

1) 可以通过使用singleton作为连接字符串名称来丑陋地解决

2) 如果不引入共享数据,就无法在静态类中解决问题:即不在背后插刀子。

你知道MySQL Connector for.NET现在有一个MySqlHelper类吗(你可以在这里的源代码中查看它)?

如果您要走这条路,您可能会考虑使用Microsoft DAAB SqlHelper v2产品。它使用了相同的概念,但更加健壮。它还缓存SqlParameters。该代码大约在2001年问世,一直被许多开发人员使用。

http://www.microsoft.com/download/en/details.aspx?id=435