經檢查後發現,這是因為頁面在讀取資料庫中的資料時耗時太長,超過了預設的30秒。所以報出了以上錯誤,解決該問題的方法是:
一,優化sql語句,提高查詢速度
二,延長sql超時的時間設定
最好的方法當然是第一種了,這才是治本的方法。但sql優化可不是一件簡單的活,具體的環境有不同的方法。本章主要看一下如何通過第二種方法來解決問題。
1,首先設定sql的執行超時時間。
如果我們的sql是直接使用SqlCommand物件來執行的,那麼可以設定SqlCommand的CommandTimeout屬性的值。
比如:
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
cmd.CommandTimeout=180
}
這樣我們就設定了cmd的超時間時間是180秒。
注意:SqlCommand.CommandTimeout屬性的單位為秒,預設值是30。
如果我們的sql是利用SqlDataAdapter物件來獲取資料集合,那麼我們還可以分別通過以下方法設定SqlCommand的超時時間。
using (SqlConnection connection = GetConnection())
{
……
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand.CommandTimeout = 180;//設定查詢sql的超時時間
sqlDA.InsertCommand.CommandTimeout = 180;//設定插入sql的超時時間
sqlDA.UpdateCommand.CommandTimeout = 180;//設定修改sql的超時時間
sqlDA.DeleteCommand.CommandTimeout = 180;//設定刪除sql的超時時間
……
}
也許大家在有些網站上看到以下解決方法
1),在資料庫的連線字串中新增超時時間設定,如下:
SqlConnection con = new SqlConnection'server=.;database=myDB;uid=sa;pwd=password;Connect Timeout=180'
但我有測試過,無效,也有可能是我的測試方法錯誤吧!!!
2),設定SqlConnection物件的超時時間。
該方法是肯定行不通了,因為SqlConnection的ConnectionTimeout屬性根本就是個只讀屬性,不允許設定值。從它的定義就可以看出來了,定義如下:
//
//摘要:
//獲取在嘗試建立連線時終止嘗試並生成錯誤之前所等待的時間。
//
//返回結果:
//等待連線開啟的時間(以秒為單位)。預設值為 15 秒。
//
// 異常:
//System.ArgumentException:
//所設定的值小於 0。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[ResDescription("SqlConnection_ConnectionTimeout")]
public override int ConnectionTimeout { get; }
2,設定asp.net請求的超時時間。
在上面的設定中我們有處理了sql的超時時間,但可能你的設定還是無效。這是為什麼呢?因為你還沒有設定asp.net請求的超時時間。
要如何設定asp.net請求的超時時間呢?修改web.config的httpRunTime節即可,示例如下:
<system.web>
<httpRuntime executionTimeout="180" />
</system.web>
其中httpRuntime屬性與executionTimeout屬性的意思分別如下:
httpRuntime:配置 ASP.NET HTTP 執行時設定,以確定如何處理對 ASP.NET 應用程式的請求。
executionTimeout:設定asp.net關閉前允許發生的上載秒數
設定完這兩步,我們的問題才算的真正的解決了。