0

我的應用程序是asp.net MVC3中,我使用的SQLExpress 2012年我收到以下錯誤超時連接到SQL Server Express 2012

超時過期。操作完成之前超時的時間或服務器沒有響應。

當我嘗試運行以下命令:

public static List<vw_MasterView> GetMasterView(DateTime? fromDate, DateTime? toDate) 
{ 
    if (fromDate == null) fromDate = new DateTime(1900, 1, 1); 
    if (toDate == null) toDate = DateTime.Now; 
    using (DALDataContext ctx = new DALDataContext()) 
    { 
     var q = from c in ctx.vw_MasterViews 
       where c.FirstVisitDate >= fromDate && c.LastVisitDate <= toDate 
       select c; 
     return q.ToList(); 
    } 
} 

我確實增加了連接時間(服務器/提前屬性)至6000

當我運行從設計師的觀點(在SQL Server)我得到相同的錯誤消息,但是當我運行查詢(在SQL服務器)它工作正常,它需要54秒執行。

我希望你的建議,在此先感謝。

+1

您可以檢查是否存在打開交易? sp_who(http://msdn.microsoft.com/en-us/library/ms174313.aspx)可能能夠列出持有連接的所有進程。 –

+0

有幾個sa(背景和睡眠),只有一個用戶可以運行。 – hncl

+0

在這種情況下,我想知道DALDataContext的作用是什麼?是否有可能分享實施? –

回答

-1

DataContext類的CommandTimeout的默認值設置爲30秒。任何數據庫查詢需要花費較長的時間才能完成超過30秒(並且正如您所寫的,大約需要60秒)將會拋出一個System.Data.SqlClient.SqlException:超時過期異常

如果你看一下自動生成的DALDataContext子類,你會有幾個部分方法聲明,你的興趣點應該是OnCreated方法。你可以用相同的全名定義OnCreated方法的主體在另一個部分類爲自動生成的類,並以下列方式設置所需的超時值有:

partial class DALDataContext : System.Data.Linq.DataContext 
{ 
    partial void OnCreated() 
    { 
     this.CommandTimeout = 100; 
    } 
} 
+0

非常感謝tpeczek,優秀的解決方案;它工作得很好。再次感謝。 – hncl

+0

這不是一個答案,對不起。 30秒?這是NUTS作爲答案。這種在裝載系統上花費30秒的查詢就像是一輛奔馳車,最高時速爲40公里/小時,並且你知道這是交通法的問題。這是一個查詢,在一個低於1億條記錄的表中,應該採用單位數字秒。 – TomTom

+0

@TomTom好的,現實生活中的例子。在我的其中一個項目中,SQL Server和Oracle之間存在鏈接的服務器連接,並且由於網絡組織的原因,使用此鏈接的問號總是需要將近2分鐘(應用程序也不允許直接連接Oracle服務器) - 許多奇怪的現實生活由於您沒有影響的奇怪要求可能會發生情況。問題不在於優化他的查詢(當然,這可能只是一個糟糕的查詢),但解決了超時問題。 – tpeczek

0

您可能需要設置timout你的DbContext的連接:

ctx.CommandTimeout = 200; 
+0

不,他沒有。 「獲得更快的機器」和「等待」在這裏不是有效的答案。除非他有TONS數據,否則這個查詢不需要30秒。 – TomTom

+0

@TomTom無視他正在研究的背景,我們**回答** – noobob

+0

不,你不知道。當你第一次指出問題時,你會提出一個壞建議。你只是偶然的工作作爲外包?不管怎樣,不管怎樣,它都可以工作,所以我們可以得到報酬? – TomTom

相關問題