2
public class db
{
    public static string connectionString =
           WebConfigurationManager.ConnectionStrings["connectString"].ConnectionString;
    public static SqlConnection OpenConnection() 
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}

我看到这样的代码,它尖叫错误!它适用于 ASP.NET (2.0)。我理解这是错误的。

一方面,您不应该打开 SqlConnection 并将其返回,另外,您为什么要创建静态 SqlConnection?如果多人同时尝试使用它,这不会造成问题吗?

4

4 回答 4

12

静态的是OpenConnection()返回连接的方法。然而,每次都会返回一个新的连接(假设调用者将在适当的时候负责处理这个连接对象)。

换句话说,显示的 db 类根本不是单例。混淆可能是由于不需要实例化 db 的实例来使用它的 OpenConnection() 方法(因为它是静态的),其余代码可能包含多个片段,例如

myConn = db.OpenConnection();
-- then do something with myConn
于 2009-10-19T22:32:16.560 回答
3

我不是 100% 确定问题是什么,但要回答这个问题

如果多人同时尝试使用它,这不会造成问题吗?

不,不会有问题,因为每次调用 OpenConnection() 都会构造一个新的 SqlConnection 实例。这并不意味着由于其他原因代码不是垃圾。我至少希望对这个方法的调用看起来像这样:

using(var conn = db.OpenConnection())
{
  // stuff
}
于 2009-10-19T22:43:58.253 回答
0

您不能只说“错误的尖叫”,然后错误地应用“单身人士”一词。为什么单个静态连接是一种糟糕的方法?如果您不每次都重新创建它,那么您的整个应用程序可以共享连接。您是否需要为每个 frigg'n sql 调用创建、打开和关闭,那是愚蠢的尖叫。无论哪种方式,ADO 都应该管理这个。

于 2010-03-04T17:50:43.080 回答
0

连接对象的范围必须限定为执行事务的方法。在线程之间共享相同的连接对象会破坏连接池。请参阅SQLDataReader.GetOrdinal() 上的这个问题,IndexOutOfRange 很少失败

于 2010-10-04T18:51:40.727 回答