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

这是我的示例代码:

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中编写自己的Provider类

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

静态类很难测试。

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

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

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

明显的缺点是:

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

1)通过使用单例作为连接字符串名称可以解决丑陋问题

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

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

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

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