C#中使用try catch和using如何提高程式碼質量
阿新 • • 發佈:2018-12-22
簡介:
try catch我們之前說過是處理異常的,其實主要處理異常的是catch,而finally中是釋放資源的,說白了using在C# 中也是讓使用資源的物件釋放資源的,無疑和finally差不多,所以使用起來using會更加的方便,接下來我們做一個對比:
對比trycatch:
trycatch類:第一段程式碼是原始程式碼,第二段是重構的trycatch程式碼
/// <summary>
/// 該方法執行傳入則增刪改的SQL語句
/// </summary>
/// <param name="sql">要執行的SQL語句</param>
/// <returns>返回更新的記錄數</returns>
public int ExecuteNonQuery(string sql)
{
string connStr = @"Server=DESKTOP-OU60RPC\SQLSV; Database=newssystem;User ID=sa;Password=123456";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand cmd= new SqlCommand(sql,conn);
int res=cmd.ExecuteNonQuery();
conn.Close();
return res;
}
首先做三個私有的變數為空,下面的就不用再例項化了;其次製作一個自己的本類(SQLhelper)的建構函式方便下面的使用;最後在使用trycatch連線起來,這樣看起來程式碼量並沒有減少太多,雖然減少了耦合,但是看起來還增加了很多東西。
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SQLHelper() //建構函式,在下面就不用單獨每個類寫了
{
string connStr = @"Server=DESKTOP-OU60RPC\SQLSV; Database=newssystem;User ID=sa;Password=123456";
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn() //開啟資料庫連線
{
if (conn.State==ConnectionState.Closed)
{
conn.Open(); //先開啟在返回
}
return conn;
}
/// <summary>
/// 該方法執行傳入則增刪改的SQL語句
/// </summary>
/// <param name="sql">要執行的SQL語句</param>
/// <returns>返回更新的記錄數</returns>
public int ExecuteNonQuery(string sql)
{
int res;
try
{
cmd = new SqlCommand(sql, GetConn());
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State==ConnectionState.Open)
{
conn.Close();
}
}
return res;
}
對比using
接下來看我們的using用法:第一個是原始程式碼,第二個為重構的using方法使用:
/// <summary>
/// 該方法執行傳入的SQL查詢語句
/// </summary>
/// <param name="sql">SQL查詢語句</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sql)
{
DataTable dt = new DataTable();
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader sdr = cmd.ExecuteReader();
dt.Load(sdr);
sdr.Close();
conn.Close();
return dt;
}
using程式碼的前面和上面trycatch使用的變數和建構函式一樣,但是下面的程式碼從耦合上面還是簡潔性都明顯的提高了許多許多,並且using使用完畢後會回收using段內的記憶體,這樣提高了很多的效率和效能。
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SQLHelper() //建構函式,在下面就不用單獨每個類寫了
{
string connStr = @"Server=DESKTOP-OU60RPC\SQLSV; Database=newssystem;User ID=sa;Password=123456";
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn() //開啟資料庫連線
{
if (conn.State==ConnectionState.Closed)
{
conn.Open(); //先開啟在返回
}
return conn;
}
/// <summary>
/// 該方法執行傳入的SQL查詢語句
/// </summary>
/// <param name="sql">SQL查詢語句</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sql)
{
DataTable dt = new DataTable();
conn.Open();
cmd = new SqlCommand(sql, GetConn());
using (sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}