【问题标题】:How to connect to a database in ASP.NET?如何连接到 ASP.NET 中的数据库?
【发布时间】:2010-03-07 00:52:21
【问题描述】:

我从直接运行查询的 PHP 迁移到 ASP.NET。所以我总是在 Page_Load 事件中创建连接,在我做完所有需要的事情后处理它,并使用 NpgsqlCommand 访问数据。 (是的,我在我的 ASP.NET 应用程序中使用 Postgresql。)

在开始学习 ASP.NET MVC 之后,我惊讶于使用 LINQ to SQL 访问 SQL 是多么容易。但是...它仅适用于 MS SQL。所以我的问题是如何在我的应用程序中实现相同的功能?如何轻松连接数据库?

我编写了自己的包装类来连接到 Postgresql。每桌 1 个班级。

这是学生类的一部分:

public class Student : User
{
    private static NpgsqlConnection connection = null;

    private const string TABLE_NAME = "students";

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }

    /// <summary>
    /// Updates the student
    /// </summary>
    public void Update()
    {
        Connect();
        Run(String.Format("UPDATE " + TABLE_NAME + " SET first_name='{0}', last_name='{1}', password='{2}' WHERE id={3}", FirstName, LastName, Password, Id));
        connection.Dispose();
    }

    /// <summary>
    /// Inserts a new student
    /// </summary>
    public void Insert()
    {
        Connect();
        Run(String.Format("INSERT INTO " + TABLE_NAME + " (first_name, last_name, password) VALUES ('{0}', '{1}', '{2}')",FirstName, LastName, Password));
        connection.Dispose();
    }

    private static void Run(string queryString)
    {
        NpgsqlCommand cmd = new NpgsqlCommand(queryString, connection);
        cmd.ExecuteScalar();
        cmd.Dispose();
    }

    private static void Connect()
    {
        connection = new NpgsqlConnection(String.Format("Server=localhost;Database=db;Uid=uid;Password=pass;pooling=false"));
        connection.Open();
    }

    //....

因此,您在这里看到的问题是,对于每个 INSERT、DELETE、UPDATE 请求,我都在使用连接到数据库的 Connect() 方法。在我不得不等待 10 分钟插入 500 行之前,我没有意识到这是多么愚蠢,因为有 500 个连接到数据库。

在连接时使用池确实有帮助,但在每次查询期间仍然建立连接并让服务器检查池是愚蠢的。

所以我决定将 Connection 属性移动到静态 DB 类,但它也不起作用,因为将此类对象作为连接存储在静态类中是一个非常糟糕的主意。

我真的不知道该怎么办才知道。是的,可以选择手动在每个 Page_Load 事件中创建连接并最终关闭它们,就像我现在正在做的那样。

Student student = new Student { FirstName="Bob", LastName="Black" };
NpgsqlConnection connection = ... ;
student.Insert(connection);

但是这段代码非常难看。我会非常感谢能在这里帮助我的人。

【问题讨论】:

  • 如果您希望每个请求一个连接,那么问题末尾的代码有什么问题?当您第一次需要 db 访问权限来生成页面时,您创建并打开连接,然后在完成构建后关闭并释放连接。除此之外,您还在寻找什么?你只想写一次?创建一个基类或 IHttpHandler 为您完成它。还有什么?
  • 感谢您的回复。我正在寻找与 ASP.NET MVC 和 LINQ to SQL 一样灵活的东西。您无需考虑在每个页面上创建连接。我只是想知道它是如何工作的……用反射器看源代码对我没有帮助,那些类太复杂了……

标签: asp.net database connection


【解决方案1】:

我不会推荐这种设计。最好封装每个数据库调用,这意味着每次您需要在数据库上执行某些操作时,每个调用都会打开一个新连接。如果不是连接池,这听起来可能效率低下。 ASP.NET 将自动为您在池中重用连接。您设计中的问题是没有任何东西可以保证连接将被关闭。

因此,您应该尝试类似的方法

private static void Insert()
{
    var sql = "Insert Into "....;
    ExecuteActionQuery(sql);
}

private static void ExecuteActionQuery( string query )
{
    using (var conn = new NpgsqlConnection(String.Format(connString))
    {
        conn.Open();
        using ( var cmd = new NpgsqlCommand(query, connection) )
        {
            cmd.ExecuteNonQuery();
        }
    }
}

我通常会创建一些封装标准操作的全局函数,这样我只需要传递一个查询和参数,其余的由我的方法完成。在我的示例中,我的 ExecuteActionQuery 不带参数,但这仅用于演示。

【讨论】:

  • 如您所见,我确实在每个 Insert、Delete 和 Select 方法中处理连接对象,最后调用 Dispose() 方法。我明白你在说什么......这可能是用于 LINQ to SQL 的......所以即使我每次执行查询时都在创建/处理连接对象,但它对整体没有任何坏处申请?
  • 连接池专门用于降低打开和关闭连接的成本,以便您可以封装数据库调用。最后,确保在每次 db 调用之后对连接实例调用 dispose(通过 using 构造)比尝试记住通过 Unload 事件关闭它更安全。
【解决方案2】:

不是真的与您的问题有关,而是另一种解决方案,如果您喜欢 linq to sql,您可以尝试 DBLinq,它为 Postgresql 和其他数据库提供 Linq to SQL 提供程序。

http://code.google.com/p/dblinq2007/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多