[英]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提供程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.