Thay đổi thời gian chờ của SqlConnection


81

Tôi đang cố gắng ghi đè SqlConnectionthời gian chờ mặc định là 15 giây và gặp lỗi nói rằng

Thuộc tính hoặc trình chỉ mục không thể được chỉ định vì nó chỉ được đọc.

Có cách nào để giái quyết vấn đề này không?

using (SqlConnection connection = new SqlConnection(Database.EstimatorConnection))
{
   connection.Open();

   using (SqlCommand command = connection.CreateCommand())
   {
       command.CommandType = CommandType.StoredProcedure;
       connection.ConnectionTimeout = 180; // This is not working 
       command.CommandText = "sproc_StoreData";
       command.Parameters.AddWithValue("@TaskPlanID", order.Projects[0].TaskPlanID);
       command.Parameters.AddWithValue("@AsOfDate", order.IncurDate);

       command.ExecuteNonQuery();
    }
}

5
Ý của bạn là đặt thời gian chờ kết nối sau khi bạn cố gắng mở kết nối? ý bạn là hết thời gian lệnh?
Alex K.

2
Tôi thực sự, thực sự không hiểu tại sao họ đặt thuộc tính chỉ đọc. Nên đọc-ghi, IMO.
xofz

Thuộc tính chỉ đọc sau khi kết nối. Xem các câu trả lời khác để thảo luận. ConnectionTimeout ảnh hưởng đến thời gian chờ khi cố gắng kết nối. nó thường hữu ích để tăng điều này cho Azure SQL DB. CommandTimeout ảnh hưởng đến thời gian chờ khi chạy truy vấn.
Bill Gibson - MSFT

@Sam Pearson Nó được đọc-ghi ngay cho đến khi kết nối được mở tức là khi kết nối.Open (); được gọi là. Từ thời điểm này, bộ đếm thời gian đã chạy.
WonderWorker

Câu trả lời:


155

Nếu bạn muốn cung cấp thời gian chờ cho một truy vấn cụ thể, thì CommandTimeout là con đường tiếp theo.

Cách sử dụng của nó là:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.

15
Anh ấy không nói về thời gian chờ lệnh, anh ấy đang nói về thời gian chờ kết nối.
LarryBud

39

Bạn có thể đặt giá trị thời gian chờ trong chuỗi kết nối, nhưng sau khi bạn kết nối, nó ở chế độ chỉ đọc. Bạn có thể đọc thêm tại http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Như Anil ngụ ý, ConnectionTimeout có thể không phải là thứ bạn cần; nó kiểm soát thời gian trình điều khiển ADO sẽ đợi khi thiết lập một kết nối mới. Việc sử dụng của bạn dường như cho thấy cần phải đợi lâu hơn bình thường để một truy vấn SQL cụ thể thực thi và trong trường hợp đó Anil chính xác là đúng; sử dụng CommandTimeout (là R / W) để thay đổi thời gian hoàn thành dự kiến ​​cho một SqlCommand riêng lẻ.


19

Một cách rõ ràng hơn là đặt connectionString trong tệp xml, chẳng hạn Web.Confing(WepApplication)hoặc App.Config(StandAloneApplication).

 <connectionStrings>
    <remove name="myConn"/>
    <add name="myConn" connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>

Bằng mã, bạn có thể nhận được kết nối theo cách này:

public static SqlConnection getConnection()
{
        string conn = string.Empty;
        conn = System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
        SqlConnection aConnection = new SqlConnection(conn);
        return aConnection;
}

Bạn chỉ có thể đặt ConnectionTimeoutbạn tạo một phiên bản. Khi phiên bản được tạo, bạn không thay đổi giá trị này.


17

Bạn luôn có thể thêm nó vào Chuỗi kết nối của mình:

connect timeout=180;

2
Thời gian chờ kết nối khác với CommandTimeout. Thời gian chờ kết nối là khoảng thời gian cần thiết để giải quyết kết nối ban đầu với cơ sở dữ liệu. CommandTimeout thay đổi khoảng thời gian chờ cho truy vấn cụ thể.
m0g

@ m0g Tôi không hiểu tại sao đây không phải là câu trả lời được chấp nhận. Câu hỏi ở đây có lẽ rất rõ ràng về Thời gian chờ kết nối, mặc định là 15 và là thuộc tính chỉ đọc của một SqlConnection phải được xác định trong Chuỗi kết nối. Dòng mã mà người đăng liệt kê đặc biệt cố gắng thiết lập SqlConnection.ConnectionTimeout. Command Timeout mặc định là 30 và là một tham số đọc / ghi của SqlCommand, một đối tượng hoàn toàn khác. Thông báo lỗi của câu hỏi hiển thị giá trị là 15 và câu hỏi cụ thể là SqlConnection, không phải SqlCommand.
Bacon Bits

1
@BaconBởi những gì người đăng câu hỏi mô tả và hỏi so với những gì anh ta muốn là khác nhau, do đó câu trả lời được chấp nhận là một cái gì đó khác nhau.
m0g

8

Bạn có thể thêm Connection Timeout=180;vào chuỗi kết nối của mình


4
Thời gian chờ kết nối khác với CommandTimeout. Thời gian chờ kết nối là khoảng thời gian cần thiết để giải quyết kết nối ban đầu với cơ sở dữ liệu. CommandTimeout thay đổi khoảng thời gian chờ cho truy vấn cụ thể.
m0g

7

Bạn cũng có thể sử dụng SqlConnectionStringBuilder

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}

6

Bài cũ nhưng khi nó xuất hiện cho những gì tôi đang tìm kiếm, tôi nghĩ rằng tôi sẽ thêm một số thông tin vào chủ đề này. Tôi đã định thêm một bình luận nhưng tôi không có đủ đại diện.

Như những người khác đã nói:

kết nối.ConnectionTimeout được sử dụng cho kết nối ban đầu

command.CommandTimeout được sử dụng cho các tìm kiếm, cập nhật riêng lẻ, v.v.

Nhưng:

connect.ConnectionTimeout cũng được sử dụng để cam kết và quay lại các giao dịch.

Vâng, đây là một quyết định thiết kế hoàn toàn điên rồ.

Vì vậy, nếu bạn sắp hết thời gian chờ khi cam kết hoặc khôi phục, bạn sẽ cần tăng giá trị này thông qua chuỗi kết nối.


"Connection.ConnectionTimeout cũng được sử dụng để cam kết và khôi phục các giao dịch. Vâng, đây là một quyết định thiết kế hoàn toàn điên rồ." Có thật không? Tôi không tin điều này là sự thật. Nếu đúng thì bất kỳ giao dịch nào kéo dài hơn thời gian chờ kết nối là 15 giây sẽ không thành công. Bạn cần phải làm rõ.
Triynko

Bây giờ, nếu bạn có nghĩa là nó được sử dụng như thời gian chờ để chỉ gửi lệnh cam kết hoặc quay lại, thì không ... đó không phải là một quyết định điên rồ. Về cơ bản đây là một lệnh tức thời sẽ trả về ngay lập tức, vì nó chỉ báo hiệu cho máy chủ cam kết hoặc quay trở lại. Nếu nó không đến được máy chủ và nhận được phản hồi ngay lập tức, thì về cơ bản đó là thời gian chờ kết nối, đó là lý do tại sao bạn nên sử dụng theo cách đó.
Triynko

3

Bạn có thể đặt thời gian chờ kết nối thành cấp độ kết nối và cấp độ lệnh.

Thêm "Thời gian chờ kết nối = 10" vào chuỗi kết nối. Hiện thời gian chờ kết nối là 10 giây.

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=10";
using (var con = new SqlConnection(connectionString))
{

}

Đặt thuộc tính CommandTimeout thành SqlCommand

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword";
using (var con = new SqlConnection(connectionString))
{

    using (var cmd =new SqlCommand())
    {
        cmd.CommandTimeout = 10;
    }

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.