使用此静态类有哪些潜在问题

时间:2011-05-27 18:08:04

标签: c# asp.net oop class static

以下是我的示例代码:

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");

我想知道使用此静态类的问题。

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

感谢您的任何意见。

修改:更新了代码。这会对所提供的答案产生影响吗?对不起,我应该在开头发帖。

7 个答案:

答案 0 :(得分:7)

我假设连接字符串在执行期间没有改变(你可能想让它只读)。由于问题中没有显示其他共享状态,因此没有实际问题。

但是,如果您有任何共享状态,则会出现巨大的线程问题。如果您共享连接,则会遇到更大的问题。

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

答案 1 :(得分:4)

我认为他的回答很清楚。

Writing my own Provider Class in ASP.NET

“请记住,连接将在所有用户的同一实例中共享,这可能会导致错误的问题......”

答案 2 :(得分:2)

静态类很难测试。

您的问题提到,要进行更改,您必须在几个网站上更改课程。如果您的网站耦合到一个界面,那么交换实现将相对简单。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

明显的缺点是:

  • 硬编码连接字符串
  • 在驱动程序中没有连接池这是非常糟糕的://打开conn + //关闭conn

1)可以通过使用单例作为连接字符串名称

来解决

2)在不引入共享数据的情况下无法在静态类中求解:即。没有在你的背后种植刀。

答案 5 :(得分:0)

您是否知道MySQL Connector for .NET现在有一个MySqlHelper类(您可​​以在源here中查看它)?

答案 6 :(得分:0)

如果您打算采用这种方式,您可以考虑使用Microsoft DAAB SqlHelper v2产品。它使用相同的概念,但更加健壮。它还缓存SqlParameters。该代码大约在2001年出现,并且一直被许多开发人员使用。

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