2013-03-05 82 views
1

我正在將asp網站升級到asp.net。我正在嘗試遵循多種方法。 我的基本dal層如下,它返回一個數據表並插入給定的查詢。在以下情況下使用靜態方法訪問數據庫安全嗎

using System; 
using System.Configuration; 
using System.Data; 
using MySql.Data.MySqlClient; 

public class mydatautility 
{ 
    public mydatautility() 
    { 
    } 
    public static DataTable Table(string query) 
    { 
     string constr = ConfigurationManager.ConnectionStrings["db_con"].ConnectionString; 
     DataTable table = new DataTable(); 
     try 
     { 
      using (MySqlConnection con = new MySqlConnection(constr)) 
      { 
       con.Close(); 
       MySqlCommand com = new MySqlCommand(query, con); 
       MySqlDataAdapter da = new MySqlDataAdapter(com); 
       con.Open(); 
       da.Fill(table); 
       con.Close(); 
       da = null; 
       com = null; 
       con.Dispose(); 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return table; 
    } 
    public static int Insert_intoemployee(string query) 
    { 
     string constr = ConfigurationManager.ConnectionStrings["db_con"].ConnectionString; 
     int done = 0; 
     try 
     { 
      using (MySqlConnection con = new MySqlConnection(constr)) 
      { 
       MySqlCommand com = new MySqlCommand(query, con); 
       con.Open(); 
       done = com.ExecuteNonQuery(); 
       con.Close(); 
       com = null; 
       con.Dispose(); 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return done; 
    } 
} 

我不確定當運行2個併發查詢時會發生什麼。
如何測試併發問題?

+0

您可能正在尋找「SQL Profiler」。 – 2013-03-05 04:57:48

+1

這是安全的。每個查詢都是孤立的。 – Win 2013-03-05 05:04:52

+0

我覺得我應該指出'ExecuteNonQuery'返回受影響的行數。所以你的'Insert'方法實際上不會返回主鍵。如果那是你想要的。你正在尋找'ExecuteScalar'。 – 2013-03-05 05:05:14

回答

2

不會有併發問題,因爲每個請求都有自己的線程和靜態方法有單獨的調用每個線程的堆棧。但是,代碼中有一些建議。

using System; 
using System.Configuration; 
using System.Data; 
using MySql.Data.MySqlClient; 

public static class mydatautility//change to Utilities 
{ 
    public mydatautility()//not required in this scenario 
    { 
    } 
    public static DataTable Table(string query) //change method name to GetTable 
    { 
     string constr = ConfigurationManager.ConnectionStrings["db_con"].ConnectionString; 
     DataTable table = new DataTable(); 
     try 
     { 
      using (MySqlConnection con = new MySqlConnection(constr)) 
      { 
       con.Close();//not required 
       using(MySqlCommand com = new MySqlCommand(query, con)) 
       { 
       MySqlDataAdapter da = new MySqlDataAdapter(com); 
       con.Open(); 
       da.Fill(table); 
       con.Close(); 
       da = null;// reduntant, not required 
       com = null;// reduntant, not required 
       con.Dispose();// reduntant, not required 
       } 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return table; 
    } 
    public static bool InsertEmployee(string query)// consider changing int to bool since you only require result of operation 
    { 
     string constr = ConfigurationManager.ConnectionStrings["db_con"].ConnectionString; 
     int done = 0; 
     try 
     { 
      using (MySqlConnection con = new MySqlConnection(constr)) 
      { 
       Using(MySqlCommand com = new MySqlCommand(query, con)) 
       { 
       con.Open(); 
       done = com.ExecuteNonQuery(); 
       con.Close(); 
       com = null;// reduntant, not required 
       con.Dispose();// reduntant, not required 
       } 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return done > 0; // checks rows affected greater than 0 
    } 
} 
+0

+0。你有很好的代碼建議(在'using'塊結束之前也錯過了'con.Close()'),但是你解釋了爲什麼沒有問題是可疑的。每個請求在其自己的線程上運行的事實只會增加出現問題的可能性,絕不會消除它們。 – 2013-03-05 05:48:16

+0

我在這種情況下也提到過,靜態方法每個線程都有單獨的調用堆棧,所以不會有併發問題。我讀了每個請求在單獨的線程上執行,http://stackoverflow.com/questions/1416351/asp-net-does-every-httprequest-get-its-own-thread,http://stackoverflow.com/questions/8084143/does-an-asp-net-http-request-translate-to-1-thread – Sunny 2013-03-05 05:57:50

+0

但是爲什麼在頁面類中聲明一個變量時會出現併發問題。我已經看到變量對所有頁面實例都保持相同的變量,爲此我必須轉換到會話。糾正我,如果我錯了。 – Ratna 2013-03-05 06:36:50

1

我認爲這是安全的,但不好的做法。如果您使用靜態方法訪問實時資源,那麼您想如何對它們進行單元測試?你不能真正模擬數據庫訪問。

相關問題