2011-10-01 73 views
0

你可以檢查我的這個功能嗎。線程安全還是不被使用?我想了解公共靜態類是如何工作的。公共靜態類中的非靜態成員是否線程安全?

該函數將用於通過用戶名從數據庫獲取訪問者的userId。可能會發生很多併發呼叫。這也將是最好的性能方式和SQL注入安全。

ASP.net 4.0 - C# - MSSQL 2008 R2 - IIS 7.5

using System; 
using System.Data.Sql; 
using System.Data.SqlClient; 
using System.Data; 

public static class csGetUserId 
{ 
    public static string srCommandText = "select UserId from tblUsersProfile where [email protected]"; 

    public static string ReturnUserId (string srUserName) 
    { 
     string srUserId = "0"; 

     using (SqlConnection connection = new SqlConnection(DbConnection.srConnectionString)) 
     { 
      try 
      { 
       SqlCommand cmd = new SqlCommand(srCommandText, connection); 
       cmd.CommandType = CommandType.Text; 
       cmd.Parameters.AddWithValue("@userName", srUserName); 
       SqlDataReader dsReader = null; 
       connection.Open(); 
       dsReader = cmd.ExecuteReader(); 
       if (dsReader.HasRows) 
       { 
        while (dsReader.Read()) 
        { 
         srUserId=dsReader["UserId"].ToString(); 
        } 
       } 
       else 
       { 

       } 
      } 
      catch 
      { 
       srUserId="-1"; 
      } 
     } 
     return srUserId; 
    } 
} 

回答

1

假設數據庫支持多個連接和您更改srCommandText是隻讀的,則此方法是線程安全的。 將srCommandText設置爲只讀,也可以防止SQL注入。

+0

yes數據庫是microsoft sql server 2008 r2。所以變量srUserId對於每個會話都是唯一的嗎?無論何時發生呼叫,它都會被創建和使用。因此可以說100個併發呼叫發生了。在這種情況下,該功能將如何工作? 1完成然後去另外一個或100個電話同時執行? – MonsterMMORPG

+0

srUserId是一個方法變量。每個方法調用都會創建一個不同的實例。該方法將並行執行多次。請注意,您不應該「吞下」異常。您至少應該記錄錯誤消息。 – Erel

+0

但是當100個併發呼叫發生時,他們會在同一時間執行或開始第一次完成開始秒? – MonsterMMORPG