0

私は危機的状況の問題に直面しています

同じナノ秒で複数のリクエストを処理しているポータルで、リーダーがランダムに閉じられている場合の無効な呼び出し試行

プロジェクトのテストまたはデバッグ中に状況が発生していない間、ここ数日から。

元:

web.configでの接続はこんな感じ

<add name="testconnection" connectionString="Data Source=1.1.1.1;Initial Catalog=testdb;MultipleActiveResultSets=True;Persist Security Info=True;User ID=testUser;Password=testpassword;Max Pool Size=20000;Min Pool Size=5;Pooling=true;" providerName="System.Data.SqlClient" />

C# のコードは次のようになります。

SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["testconnection"].ToString());

    public string Adscategory(string Name)   
    {    
     string temp = string.Empty; 

     if (conn.State != ConnectionState.Open)     
     {      
      conn.Open();      
     }       
 SqlCommand comm = new SqlCommand("select Id from TestTable where tid='" + Name + "'", conn);    

   try       
   {      
    temp = Convert.ToString(comm.ExecuteScalar());      
   }   

  catch{}
  finally   
  {          
  conn.Close();       
  }       
return temp;   

}

今、私は2つの問題を抱えています

1- 複数の要求が同時に行われたときに、この行の comm.ExecuteScalar() で発生する、リーダーが閉じているときに Read を呼び出す無効な試行。

2-接続が閉じられませんでした。接続の現在の状態は接続中です。これは、ランダムに生成される conn.Open() で発生します。

どんな助けもかなりのものであるべきです。

4

1 に答える 1

2

SqlParameter使用法と適切な例外処理は、エラーの回避に役立つはずです。using漏れを防ぐために使い捨ての物体も強くお勧めします。

public string Adscategory(string Name)
{
string temp = String.Empty;
using (SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["testconnection"].ToString()))
{
    conn.Open();
    // INJECTION ALERT: Use the appropriate SqlParameters
    using (SqlCommand comm = new SqlCommand(String.Format("SELECT Id FROM TestTable WHERE tid=@nameParam", Name), conn))
    {
        comm.Parameters.AddWithValue("@nameParam", Name);

        try
        {
            temp = comm.ExecuteScalar().ToString();
        }
        catch(SqlException ex) { /*DB error, react appropriately !*/ }
        // catch(Exception ex) { /*Gotta catch'em all ... don't do this. */ }
    }
    return temp;
}
于 2012-12-18T13:04:28.367 に答える