2009-07-10 45 views
31

Đây không phải là thời gian chờ kết nối do kết nối với cơ sở dữ liệu được thực hiện tốt. Vấn đề là thủ tục được lưu trữ mà tôi đang gọi mất nhiều thời gian hơn, nói, 30 giây và gây ra một thời gian chờ.Cách kéo dài thời gian chờ của truy vấn SQL

Mã của hàm trông giống như sau:

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString); 
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues); 

Cuộc gọi ExecuteScalar là thời điểm ra. Làm thế nào tôi có thể kéo dài thời gian chờ của chức năng này?

Để biết các thủ tục được lưu trữ nhanh chóng, nó hoạt động tốt. Tuy nhiên, một trong các chức năng mất một lúc và cuộc gọi không thành công. Tôi dường như không thể tìm thấy bất kỳ cách nào để kéo dài khoảng thời gian chờ khi hàm ExecuteScalar được gọi theo cách này.

+4

OK, downvoting câu hỏi của tôi chỉ là thô lỗ. Câu hỏi của tôi được xác định rõ ràng và (hy vọng) có một câu trả lời. – BoltBait

Trả lời

27

Nếu bạn đang sử dụng EnterpriseLibrary (và có vẻ như bạn đang có) thử này:

Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase("ConnectionString"); 
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName"); 
cmd.CommandTimeout = 600; 
db.AddInParameter(cmd, "ParameterName", DbType.String, "Value"); 

// Added to handle paramValues array conversion 
foreach (System.Data.SqlClient.SqlParameter param in parameterValues) 
{ 
    db.AddInParameter(cmd, param.ParameterName, param.SqlDbType, param.Value); 
} 

return cmd.ExecuteScalar(); 

Edited để xử lý các mảng paramValues ​​trực tiếp dựa trên các ý kiến. Tôi cũng bao gồm giá trị ConnectionString của bạn:

Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(connectionManager.SqlConnection.ConnectionString); 
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName", parameterValues); 
cmd.CommandTimeout = 600; 
return cmd.ExecuteScalar(); 
+0

Đang thử ngay bây giờ ... – BoltBait

+0

Hmmm ... Tôi không có quyền truy cập vào ParameterNames. Biến parameterValues ​​trong mã mẫu của tôi được định nghĩa là "object [] parameterValues". Tôi vẫn có thể thêm các tham số mà không biết tên chỉ theo thứ tự? – BoltBait

+0

Tôi đã thêm mã sẽ chuyển đổi mảng paramValues ​​của bạn thành các tham số được mong đợi bởi DbCommand. –

22

bạn làm điều này bằng cách thiết lập SqlCommand.CommandTimeout tài sản

+3

Mà sẽ làm việc tuyệt vời nếu tôi đã sử dụng một SqlCommand ... nhưng, tôi không. – BoltBait

+3

Có, bạn đang có. SqlDatabase không phải là một phần của nhà cung cấp dữ liệu chuẩn; đó là một lớp bao bọc mà ai đó đã viết, và nó sẽ sử dụng một đối tượng SqlCommand trong nội bộ. –

+3

"ai đó" có thể là Microsoft, mặc dù - đây có phải là lớp SQLDatabase từ Microsoft.Practices.EnterpriseLibrary không? –

0

Mladen là đúng nhưng nếu bạn phải làm điều này bạn có thể có một vấn đề lớn hơn với các proc riêng của mình. Trong quá trình tải, có thể mất nhiều thời gian hơn thời gian chờ mới của bạn. Có thể đáng để dành thời gian chất lượng với proc để tối ưu hóa.

+1

Cảm ơn bạn đã nói với tôi để tối ưu hóa ứng dụng của tôi. Thở dài. Về lâu dài có thể xảy ra, nhưng đối với TODAY tôi chỉ cần để có được điều này đang chạy. – BoltBait

+0

Tôi chắc chắn có nghĩa là không có hành vi phạm tội. Nó chỉ là nếu SQL là thời gian ra, nó không chắc bạn sẽ có thể tìm thấy một thời gian chờ # mà sẽ làm việc trong mọi tình huống. Bạn muốn SQL hết thời gian trong nhiều trường hợp và mặc định vẫn còn khá dài. – n8wrl

2

Hãy thử một

SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString); 
connectionStringBuilder.ConnectTimeout = 180; 
connection.ConnectionString = connectionStringBuilder.ConnectionString; 

connection.Open(); 
SqlCommand command = new SqlCommand("sp_ProcedureName", connection); 
command.CommandType = CommandType.StoredProcedure; 
command.CommandTimeout = connection.ConnectionTimeout; 
command.ExecuteNonQuery(); 
connection.Close(); 
5

Tôi nghĩ rằng đây có thể là một cách tốt hơn để làm điều này (như của doanh nghiệp Thư viện 6.0):

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString); 
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand(storedProc, parameterValues); 
cmd.CommandTimeout = 600; 
return db.ExecuteScalar(cmd); 
+0

cảm ơn bạn thân này tiết kiệm rất nhiều giờ của tôi. rất nhiều đánh giá cao –

Các vấn đề liên quan