2

私は C# コードを書いており、LINQ といくつかのストアド プロシージャを使用しています。接続の開閉には注意していますが、このエラーが発生し続けます。

Timeout expired.  
The timeout period elapsed prior to obtaining a connection from the pool.  
This may have occurred because all pooled connections were in use and max pool size was reached.

私のコードはこのエラーの発生を除いて完全に動作します。どうすればよいですか?

アイデアをありがとう。

 public static List<int> GetIslemIdleribySPbyCariId(int cariId)
    {
        string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;

        SqlConnection sqlConn = new SqlConnection(connString);
        sqlConn.Open();

        List<int> islemidleri = new List<int>();
        islemidleri.Clear();

        SqlCommand cmd;
        cmd = new SqlCommand("GetIslemIdleri", sqlConn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@CARIID", cariId));

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                islemidleri.Add(reader.GetInt32(0));

            }
            cmd.Parameters.Clear();
        }

        sqlConn.Close();

        return islemidleri;

    }
    /// <summary>
    /// SP kullanarak dovizturlerini döndürür
    /// </summary>
    /// <returns>string listesi döndürür için döviz türleri var TL, USD vs.</returns>
    public static List<string> GetDovizTurleribySP()
    {
        string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;

        SqlConnection sqlConn = new SqlConnection(connString);
        sqlConn.Open();

        List<string> dovizTanimlari = new List<string>();

        string commandGetDovizTanimlari = "EXEC GetDovizTanimlari";
        SqlCommand cmd;
        cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn);

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                dovizTanimlari.Add(reader.GetString(0));
            }

        }
        return dovizTanimlari;

    }
4

3 に答える 3

3

コードから、関数で接続を閉じていませんGetDovizTurleribySPusingステートメントを使用して、例外が発生した場合でも接続が確実に閉じられるようにすることをお勧めします。

それはこのように見えるかもしれません

public static List<string> GetDovizTurleribySP()
{
  string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;

  using (SqlConnection sqlConn = new SqlConnection(connString))
  {
    sqlConn.Open();

    List<string> dovizTanimlari = new List<string>();

    string commandGetDovizTanimlari = "EXEC GetDovizTanimlari";
    SqlCommand cmd;
    cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn);

    using (var reader = cmd.ExecuteReader())
    {
      while (reader.Read())
      {
        dovizTanimlari.Add(reader.GetString(0));
      }

    }
    return dovizTanimlari;
  }
}
于 2011-03-28T14:13:20.543 に答える
1

あなたのコードを見た後、私が指摘したいことが2つあります.SqlCommand、DataReader、およびsqlConnectionをusingステートメントでラップします(はい、ネストされたusingステートメント)。また、リストを作成するときに、後でclear()を呼び出す必要はありません。すでに空に初期化されています(少なくともC#ではそう思います)。

于 2011-03-28T14:08:33.883 に答える
0

テストとテスト:

Close(); 
Dispose(); 
SqlConnection.ClearPool(connection); 
SqlConnection.ClearAllPools(); 

とりわけ式を使用して、最終的に、各 OpenConnection の「オープン プール」の問題が、維持されている「プール」を再利用しないことを発見しました (AWAITING COMMAND)。 )、それが .config 内の接続文字列への呼び出しであることに気付きました。

*System.Configuration.ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString.;*

どうやら彼は外部アセンブリを呼び出し、接続文字列またはハッシュに「違い」を引き起こしています。

解決:

アセンブリを追加しました:

System.Configuration"** and replacement implicitly invoking: ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString;

これにより、各「Open()」によって「プール」が実行されなくなり、問題が解決しました。

于 2016-03-09T18:17:36.173 に答える