深入解析“ExecuteReader 需要打開且可用的連接”錯誤
"ExecuteReader requires an open and available Connection" 錯誤提示表明在嘗試執行數據庫查詢或檢索數據時,數據庫連接尚未建立或處於非活動狀態。
代碼中使用的連接字符串使用了靜態變量,這可能是並發連接問題的根源。靜態變量在多個連接之間保持其值,如果多個用戶同時嘗試連接,則可能導致錯誤。
該錯誤的根本原因在於數據庫連接由連接池管理。連接池根據需要分配和釋放連接,從而確保高效利用資源。但是,當連接被重用或在實例之間共享(例如使用靜態變量)時,連接池可能會不堪重負,導致連接相關的錯誤。
為了解決此錯誤,務必遵循 ADO.NET 用法的最佳實踐:
通過實施這些最佳實踐,開發人員可以避免連接相關的錯誤,並確保強大的數據庫交互。
改進後的 RetrievePromotion 方法
以下是使用連接池和正確資源處置的改進版 retrievePromotion 方法:
<code class="language-csharp">public Promotion retrievePromotion(int promotionID) { Promotion promo = null; var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) { var queryString = "SELECT PromotionID, PromotionTitle, PromotionURL FROM Promotion WHERE PromotionID=@PromotionID"; using (var da = new SqlDataAdapter(queryString, connection)) { var tblPromotion = new DataTable(); da.SelectCommand.Parameters.Add("@PromotionID", SqlDbType.Int).Value = promotionID; try { connection.Open(); //显式打开连接 da.Fill(tblPromotion); if (tblPromotion.Rows.Count != 0) { var promoRow = tblPromotion.Rows[0]; promo = new Promotion { promotionID = promotionID, promotionTitle = promoRow.Field<string>("PromotionTitle"), promotionUrl = promoRow.Field<string>("PromotionURL") }; } } catch (Exception ex) { // 记录或抛出异常 } } } return promo; }</code>
在此改進後的方法中,連接在 retrievePromotion 方法的範圍內創建和釋放,防止任何並發問題或連接管理問題。 注意添加了 connection.Open();
顯式打開連接,確保連接在使用前已打開。
以上是為什麼'執行主管需要開放且可用的連接”會發生,我該如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!