2011-10-01 203 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