【发布时间】: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