遇到這樣一個問題:添加互評信息,斷點調試,跳轉到BLL層后就直接跳到SqlHelper中彈出錯誤,說:未將對象設置引用到實例等。還請人幫忙調試代碼,調試半天發現抽象工廠並沒成功完成反射,奇怪的是:將出現問題的方法中換用反射其他的接口沒有問題,后來將有問題的接口和DAL層類都重寫了,問題好像解決了。所以添加互評就這么實現了,結果實現查詢操作的時候問題重現了,我逐步調試,發現這樣一個問題,調試到抽象工廠類,會發現這個問題:ServerVersion 引發了“System.InvalidOperationException”類型的異常。
如果您跟我一樣使用SqlHelper了,你可以這樣試着解決下問題:看一下你SqlHelper類中的方法是否正常使用了Try…Catch…,我的這個問題就是因為SqlHelper中Try…Catch…使用不正確,打開的數據庫連接並沒正常關閉。
出現問題的帶參數sql查詢語句或存儲過程
#region 執行帶參數的查詢SQL語句或存儲過程 /// <summary> /// 執行帶參數的查詢SQL語句或存儲過程 /// </summary> /// <param name="cmdText">查詢SQL語句或存儲過程</param> /// <param name="paras">參數集合</param> /// <param name="ct">命令類型</param> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { try { //定義並實例化DataTable表 DataTable datResult = new DataTable(); //實例化SqlCommand sqlCmd = new SqlCommand(cmdText, GetConn()); //傳來的SqlCommand類型:存儲過程、sql語句等 sqlCmd.CommandType = ct; //添加參數 sqlCmd.Parameters.AddRange(paras); using (sdr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)) { datResult.Load(sdr); } //返回數據表 return datResult; } catch { //沒有數據返回空值 return null; } finally { //關閉記錄集 sdr.Close(); //關閉數據庫 sqlConn.Close(); } } #endregion
修改后的sql查詢語句或存儲過程
#region 執行帶參數的查詢SQL語句或存儲過程 /// <summary> /// 執行帶參數的查詢SQL語句或存儲過程 /// </summary> /// <param name="cmdText">查詢SQL語句或存儲過程</param> /// <param name="paras">參數集合</param> /// <param name="ct">命令類型</param> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { //實例化一個Datatable對象 DataTable dt = new DataTable(); //創建一個連接 sqlCmd = new SqlCommand(cmdText, GetConn()); //指定命令類型 sqlCmd.CommandType = ct; //給該命令傳入參數 sqlCmd.Parameters.AddRange(paras); //將查詢出來的記錄放入dt中 using (sdr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)) { //將SqlDataReader中的記錄放入dt中 dt.Load(sdr); //關閉閱讀器 sdr.Close(); } //關閉數據庫連接 Close(); //返回DataTable return dt; } #endregion
小學問,大道理。try…catch…的作用影響很大的……