繁体   English   中英

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

[英]How to connect to a database in ASP.NET?

我从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);

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

我不推荐这种设计。 最好封装每个数据库调用,这意味着每次需要在数据库上执行某些操作时,每个调用都会打开一个新连接。 如果不是用于连接池,这听起来可能效率很低。 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不带参数,但这仅用于演示。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM