如何连接到ASP.NET中的数据库?

时间:2010-03-07 00:52:22

标签: asp.net database connection

我从PHP转移到ASP.NET,直接运行查询。所以我总是在Page_Load事件中创建Connection,在我完成所有需要的东西之后处理它,并使用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);

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

2 个答案:

答案 0 :(得分: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不接受参数,但这仅用于演示。

答案 1 :(得分:0)

与你的问题不太相关,但另一个解决方案,如果你喜欢linq to sql,你可以尝试DBLinq,为Postgresql和其他数据库提供Linq to SQL提供程序。

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