2015-06-21 73 views
2

我發現了一些關於此的帖子,但似乎找不到與我的代碼有關的帖子。在Azure SQL而不是SQL Server 2014上打開DataReader錯誤

下面的行被突出顯示與該錯誤:

Line 74:   <td> 
Line 75:    @Html.DisplayFor(modelItem => item.Equipment.ModelName) 
Line 76:   </td> 

渲染數據的視圖的部分看起來像這樣:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Location) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Position) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.SerialNo) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.InstallDate) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.ServiceFrequency) Months 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.NextServiceDate) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Equipment.ModelName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Owner.OwnerName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.ServiceCompany.CompanyName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Site.SiteName) 
     </td> 

     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.AssetID }) 
      @Html.ActionLink("Details", "Details", new { id=item.AssetID }) 
      @Html.ActionLink("Delete", "Delete", new { id=item.AssetID }) 
     </td> 
    </tr> 

控制器是這樣的:

public ActionResult Index() 
{ 
    var userId = User.Identity.GetUserId(); 
    var asset = from a in db.Assets 
       join o in db.Owners on a.OwnerID equals o.OwnerID into oa 
       from asst in oa.DefaultIfEmpty() 
       join s in db.ServiceCompanies on a.ServiceCompanyID equals s.ServiceCompanyID into sa 
       from service in sa.DefaultIfEmpty() 
       where asst.RegUserID == userId || service.RegUserID == userId 
       select a; 

    return View(asset); 
} 

我的理解我試圖連接到數據庫兩次,但我無法看到哪裏,我也d在我的筆記本電腦上不會出現這個錯誤。我覺得這可能是SQL Server 2014中沒有的Azure SQL數據庫中沒有的東西。

有什麼想法嗎?

UPDATE ::::

我已經加入MultipleActiveResultSets = true來連接字符串停止了問題但我不知道這是否掩蓋一個需要解決的問題或可能引入其他問題。

回答

1

添加MultipleActiveResultSets=true是好的。

默認情況下,我總是將它設置爲true--通常更安全,特別是如果您使用任何第三方庫。

但是,在這種特殊情況下導致此是您的代碼中存在SELECT N + 1問題(您返回SQL以獲取每個記錄以檢索另一位數據)。

例如,您呈現item.Equipment.ModelName,這會導致服務器的另一次往返(假設它們是虛擬屬性)。所以,你已經有了一個開放的連接,所以你可以遍歷結果集,並且你需要在同一個連接上運行另一個查詢來獲得設備實體。 當您迭代結果集時,這可能很容易發生在任何ORM和虛擬屬性上。您通常可以通過告訴ORM預先獲取您需要的屬性來解決它,或者通過在查詢中進行投影來更好地獲取所需的數據,這樣SQL就可以爲您提供所需的所有數據,僅此而已。性能更好。在你的情況,而不是select a,這樣做

select new { 
    a.Location, 
    a.Position 
    .... 
    EquipmentName = a.Equipment.ModelName 
    .... 
} 

現在,你可以傳遞到您的視圖作爲一個動態的(我認爲 - 不知道),但你可能會想,而不是創建一個具體類與相關的屬性(R#會爲你做),使它更容易發送到視圖。

檢測此問題的最簡單方法是使用SQL Server的本地實例上的SQL Server Profiler查看發送到SQL Server的確切查詢/查詢。

+0

感謝您的提示。我會看看。 – Spionred