Проблема с подключением к БД только несколько раз

У меня проблема с приведенным ниже кодом. Нет никакой ошибки кодирования, НО иногда возникают некоторые исключения. Я просто хотел узнать, какие проблемы с организацией кода? и как это исправить.

Иногда он показывает эти исключения

1. ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто.

2. Неверная попытка вызова FieldCount при закрытом считывателе.

Но иногда это работает без проблем, как и ожидалось

Мой код идет сюда

 [WebMethod, ScriptMethod]
public static List<HomeImageSliders> GetHomeImageSliders()
{
    List<HomeImageSliders> HomeImageList = new List<HomeImageSliders>();
    try
    {
        SqlCommand comHomeImage = new SqlCommand("SP_GetHomeImageSliders", conDB);
        comHomeImage.CommandType = CommandType.StoredProcedure;
        if (conDB.State != ConnectionState.Open)
        {
            conDB.Open();
        }
           
        SqlDataReader rdr = comHomeImage.ExecuteReader();
        DataTable dt = new DataTable();
      
            dt.Load(rdr);
            foreach (DataRow r in dt.Rows)
            {
                HomeImageList.Add(new HomeImageSliders
                {
                    Id = (int)r["Id"],
                    ImagePath = r["ImagePath"].ToString(),
                    ModifiedDate = Convert.ToDateTime(r["ModifiedDate"]).Date

                });
            }

    }
    catch (Exception ee)
    {
    }
    finally
    {
        conDB.Close();
    }
    return HomeImageList;
}

person TechGuy    schedule 20.05.2014    source источник


Ответы (3)


Вы должны использовать конструкцию «using»:

(using ommand comHomeImage = new SqlCommand("SP_GetHomeImageSliders", conDB) {
    (using SqlDataReader rdr = new SqlDataReader) {
        //do some things
    }

}
person Dean.DePue    schedule 20.05.2014
comment
Вы должны посчитать свои скобки. Кроме того, SqlDataReader has no constructors defined. - person LarsTech; 20.05.2014

Я не знаю, почему ваше соединение иногда закрывается, когда вы звоните

ExecuteReader()

Но почему бы вам не использовать вместо этого блок using:

using(SqlConnection conDB = new SqlConnection(connectionString))
{
 ...
}

это закроет ваше соединение с БД, когда оно потеряет область действия.

person user3596113    schedule 20.05.2014

попытайтесь предотвратить использование одного и того же соединения с двумя или более потоками с помощью блокировки

lock(_conDb)
{
    //// your code here
}

а также оберните свой conDb в блок, как показано ниже.

using(SqlConnection conDB = new SqlConnection(connectionString))
{
 ...
}
person Neel    schedule 20.05.2014