Tôi đang làm việc với đối tượng DAL được viết trong bố cục tương tự như mã sau. Tôi đã đơn giản hóa rất nhiều mã mã chỉ để hiển thị thiết lập.Bạn có nên sử dụng lại các đối tượng SqlConnection, SqlDataAdapter và SqlCommand không?
public class UserDatabase : IDisposable
{
private SqlDataAdapter UserDbAdapter;
private SqlCommand UserSelectCommand;
private SqlCommand UserInsertCommand;
private SqlCommand UserUpdateCommand;
private SqlCommand UserDeleteCommand;
private System.Data.SqlClient.SqlConnection SQLConnection;
public UserDatabase()
{
this.SQLConnection = new System.Data.SqlClient.SqlConnection(ConnectionString);
this.UserDbAdapter= new SqlDataAdapter();
this.UserDbAdapter.DeleteCommand = this.UserDeleteCommand;
this.UserDbAdapter.InsertCommand = this.UserInsertCommand;
this.UserDbAdapter.SelectCommand = this.UserSelectCommand;
this.UserDbAdapter.UpdateCommand = this.UserUpdateCommand;
}
private bool FillUsers(DataSet UserDataSet, out int numberOfRecords)
{
bool success = true;
numberOfRecords = 0;
string errorMsg = null;
this.UserDbAdapter.SelectCommand = this.GetUsersSelectCommand();
numberOfRecords = UserDbAdapter.Fill(UserDataSet, UsersTableName);
return success;
}
private SqlCommand GetUserSelectCommand()
{
if (this.UserSelectCommand==null)
this.UserSelectCommand= new System.Data.SqlClient.SqlCommand();
this.UserSelectCommand.CommandText = "dbo.Users_Select";
this.UserSelectCommand.CommandType = System.Data.CommandType.StoredProcedure;
this.UserSelectCommand.Connection = this.SQLConnection;
this.UserSelectCommand.Parameters.Clear();
this.UserSelectCommand.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] {
new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Variant, 0, System.Data.ParameterDirection.ReturnValue, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)});
return UserSelectCommand;
}
Có nhiều hàm Fill type khác được viết giống như cách sử dụng lại đối tượng Connection, SqlCommands và SqlDataAdapter. SqlDataAdapter quản lý việc mở và đóng SqlConnection bên trong.
Vì vậy, câu hỏi của tôi là đa phần. Thiết kế này có tệ không? Nếu vậy, tại sao?
Nếu nó là xấu, nó nên được thay đổi để giữ mọi thứ trong một phạm vi địa phương hơn như sau:
public bool FillUsers(DataSet UserDataSet)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
using (SqlCommand command = GetUsersSelectCommand())
{
using (SqlDataAdapter adapter = new SqlDataAdapter(command, conn))
{
adapter.Fill(UserDataSet, UsersTableName);
}
}
}
}
này sẽ phải được thực hiện đối với tất cả các chức năng mà dường như tạo, xử lý, và sau đó làm lại sẽ tồi tệ hơn việc giữ các vật phẩm xung quanh. Tuy nhiên, điều này có vẻ là thiết lập tôi thấy ở mọi nơi trực tuyến.
Bạn có đo lường vấn đề hiệu suất như vậy mà bạn cảm thấy cần phải tối ưu hóa không? Kết nối cơ sở dữ liệu được gộp theo thiết kế. Không cần phải "repool" trên đầu trang. – spender
Câu hỏi tương tự tôi đã hỏi một vài năm trước: http://stackoverflow.com/questions/226127/multiple-single-instance-of-linq-to-sql-datacontext – spender
Không có vấn đề về hiệu suất nào được liên kết lại. Tôi đang bắt đầu một dự án mới và cần một đối tượng truy cập dữ liệu và tò mò nếu điều này là "đúng" hoặc nếu có một cách tốt hơn. – Equixor