我从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);
但这段代码非常难看。我真的很感谢能在这里帮助我的人。
答案 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提供程序。