今天調試一個監控程序,放到環境里發現不寫庫,於是給SQL執行類異常事件做了個日志,發現報:
ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.
左看右看,沒問題呀,后來才想起,using里沒有執行db.Open,打開數據庫連接。
public class SQLHelper : IDisposable { private IntPtr handle; private readonly Component component = new Component(); private bool disposed; private readonly string _connstr = Config.ConnectionString; #region 執行SQL語句,返回影響行數 /// <summary> /// 執行查詢,返回影響行數 /// </summary> /// <param name="sql"></param> /// <returns></returns> public int iExecute(string sql) { int intTemp; try { using (var db = new SqlConnection(_connstr)) { db.Open(); var cmd = new SqlCommand(sql, db) {CommandType = CommandType.Text}; intTemp = cmd.ExecuteNonQuery(); db.Close(); } } catch(Exception ex) { FileHelper.AppendFile("D:\\Log.txt", string.Format("{0}[{1}][{2}]",sql ,ex.Message,_connstr)); intTemp = 0; } return intTemp; } #endregion #region 執行SQL語句,返回表結果 /// <summary> /// 查詢返回DataSet /// </summary> /// <param name="sql"></param> /// <returns></returns> public DataSet pExecute(string sql) { var ds = new DataSet(); try { using (var db = new SqlConnection(_connstr)) { db.Open(); var dr = new SqlDataAdapter(); var cmd = new SqlCommand(sql, db) {CommandType = CommandType.Text}; dr.SelectCommand = cmd; dr.Fill(ds); ds = (ds.Tables.Count == 0) ? null : ds; db.Close(); } } catch{} return ds; } #endregion #region 執行存儲過程,返回查詢的表結果 /// <summary> /// 執行存儲過程,返回查詢的表結果 /// </summary> /// <param name="produceName"></param> /// <param name="param"></param> /// <returns></returns> public DataSet pExecute(string produceName, SqlParameter[] param) { var ds = new DataSet(); try { using (var db = new SqlConnection(_connstr)) { db.Open(); var cmd = new SqlCommand {Connection = db,CommandType = CommandType.StoredProcedure,CommandText = produceName}; var dr = new SqlDataAdapter(); foreach (var t in param) { cmd.Parameters.Add(t); } dr.SelectCommand = cmd; dr.Fill(ds); db.Close(); } } catch (Exception){} return ds; } #endregion #region 執行存儲過程,返回影響行數 /// <summary> /// 執行存儲過程,返回影響行數 /// </summary> /// <param name="produceName"></param> /// <param name="param"></param> /// <returns></returns> public int iExecute(string produceName, SqlParameter[] param) { int intTemp = 0; try { using (var db = new SqlConnection(_connstr)) { db.Open(); var cmd = new SqlCommand { Connection = db, CommandType = CommandType.StoredProcedure, CommandText = produceName }; foreach (var t in param) { cmd.Parameters.Add(t); } intTemp = cmd.ExecuteNonQuery(); db.Close(); } } catch (Exception){} return intTemp; } #endregion #region Dispose實現 public void Dispose() { try { Dispose(true); GC.SuppressFinalize(this); } catch (Exception) { } } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { component.Dispose(); } CloseHandle(handle); handle = IntPtr.Zero; disposed = true; } } [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); #endregion }