Ошибка подключения ADO.NET System.Data.OleDb.OleDbException

Я получаю эту ошибку при попытке подключить свой веб-сайт.

Неизвестная ошибка Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.OleDb.OleDbException: неизвестная ошибка.

Может быть, я делаю что-то неправильно при открытии и закрытии соединений. Я всегда получаю эту ошибку, если 5-10 пользователей одновременно заходят на сайт. Когда пользователь входит на сайт, я обновляю или вставляю новые записи для статистики.

Я использую класс db для подключения:

  public OleDbConnection baglan()
{
    OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("~/App_Data/manisaweb.mdb"));
    baglanti.Open();
    return (baglanti);
}
   //********************************************************************
//Sql Sorgu Çalıştırma
public int cmd(string sqlcumle)
{
    OleDbConnection baglan = this.baglan();
    OleDbCommand sorgu = new OleDbCommand(sqlcumle, baglan);
    int sonuc = 0;

    try
    {
        sonuc = sorgu.ExecuteNonQuery();
    }
    catch (OleDbException ex)
    {
        throw new Exception(ex.Message + " (" + sqlcumle + ")");
    }
    finally
    {
        sorgu.Connection.Close();
    }
    return (sonuc);
}
//********************************************************************
//Kayıt Sayısı Bulma
public string GetDataCell(string sql)
{
    DataTable table = GetDataTable(sql);
    if (table.Rows.Count == 0)
        return null;
    return table.Rows[0][0].ToString();
}

//Kayıt Çekme
public DataRow GetDataRow(string sql)
{
    DataTable table = GetDataTable(sql);
    if (table.Rows.Count == 0) return null;
    return table.Rows[0];

}

//DataTable ye veri çekme
public DataTable GetDataTable(string sql)
{
    OleDbConnection baglan = this.baglan();
    OleDbDataAdapter adapter = new OleDbDataAdapter(sql, baglan);
    DataTable dt = new DataTable();

    try
    {
        adapter.Fill(dt);

    }
    catch (OleDbException ex)
    {
        throw new Exception(ex.Message + " (" + sql + ")");
    }
    finally
    {
        adapter.Dispose();
        baglan.Close();
    }
    return dt;
}

//Datasete veri çekme
public DataSet GetDataSet(string sql)
{
    OleDbConnection baglan = this.baglan();
    OleDbDataAdapter adapter = new OleDbDataAdapter(sql, baglan);
    DataSet ds = new DataSet();
    try
    {
        adapter.Fill(ds);
    }
    catch (OleDbException ex)
    {
        throw new Exception(ex.Message + " (" + sql + ")");
    }
    finally
    {
        ds.Dispose();
        adapter.Dispose();
        baglan.Close();
    }
    return ds;
}

И для СТАТИСТИКИ в main.master.cs каждое событие page_load

public void Istatistik()
{


    string IpAdres = Request.ServerVariables["REMOTE_ADDR"].ToString();//Ip Adresini alıyoruz.
    string Tarih = DateTime.Now.ToShortDateString();
    lblOnlineZiyaretci.Text = Application["OnlineUsers"].ToString();//Online ziyaretçi

    //Ogüne Ait Hit Bilgi Güncelleme
    DataRow drHit = GetDataRow("Select * from SayacHit Where Tarih='" + Tarih + "'");
    if (drHit == null)
    {
        //Bugüne ait kayıt yoksa bugunün ilk siftahını yap
        cmd("Insert into SayacHit(Tarih,Tekil,Cogul) values('" + Tarih + "',1,1)");
    }
    else
    {

        string SayfaAdi = Page.ToString().Replace("_aspx", ".aspx").Remove(0, 4); //Sayfa adını alıyoruz.
        if (SayfaAdi == "default.aspx")//Güncelleme işlemini sadece anasayfadaysa yapıyoruz
        {
            //Bugüne ait kayıt varsa Çoğulu 1 artırıyoruz.
            cmd("Update SayacHit set Cogul=Cogul+1 Where Tarih='" + Tarih + "'");
        }

        //Tekil artımı için önce Ip kontrolü yapıyoruz.
        DataRow drIpKontrol = GetDataRow("select * from SayacIp Where Ip='" + IpAdres + "'");
        if (drIpKontrol == null)
        { //Eğer ip yoksa tekilide artırabiliriz. Ip kayıtlı ise artırma işlemi yapmıyoruz.
            cmd("Update SayacHit set Tekil=Tekil+1 Where Tarih='" + Tarih + "'");
        }
    }


    //Giren Kişinin IP sini Kaydetme
    DataRow drIp = GetDataRow("Select * from SayacIp Where Ip='" + IpAdres + "'");
    if (drIp == null)
    {
        cmd("Insert into SayacIp(Ip,Tarih) values('" + IpAdres + "','" + Tarih + "')");
    }


    //Ekrana Bilgileri Yazdırabiliriz
    DataRow drSonuc = GetDataRow("Select * from SayacHit Where Tarih='" + Tarih + "'");
    lblBugunTop.Text = drSonuc["Cogul"].ToString();
    //lblBugunTekil.Text = drSonuc["Tekil"].ToString();
    //Dün Bilgilerini Çekme
    //DataRow drDun = GetDataRow("Select * from SayacHit Where Tarih='" + DateTime.Now.AddDays(-1).ToShortDateString() + "'");
    DataRow drGenel = GetDataRow("Select SUM(Tekil) as Toplam from SayacHit");
    //if (drDun != null)
    //{
    //    lblDunTop.Text = drDun["Tekil"].ToString();
    //}
    //else
    //{
    //    lblDunTop.Text = "0";
    //}

    lblGenelTop.Text = drGenel["Toplam"].ToString();
    lblIPAdresi.Text = IpAdres;
}

А тут еще 2 раздела в Default.aspx; он загружается при загрузке страницы для новостей и статей.

    db veri = new db();

    rptNews.DataSource = veri.GetDataTable("select top 5 KullaniciAdiSoyadi,Ozet,Baslik,Tarih,IcerikID,Icerik from Icerik a inner join Kullanici d on a.KullaniciID=d.KullaniciID where KategoriID = 1 and Durum = 1 Order by IcerikID Desc ");
    rptNews.DataBind();
    rptArticle.DataSource = veri.GetDataTable("select top 5 Ozet,Baslik,Tarih,IcerikID,Icerik from Icerik where KategoriID = 2 and Durum = 1 Order by IcerikID Desc ");
    rptArticle.DataBind();

Таким образом, в каждом событии загрузки страницы возникает так много запросов UPDATE, INSERT и SELECT. Если это моя проблема, есть ли другой способ сделать это?


person Ibrahim AKGUN    schedule 07.06.2009    source источник


Ответы (2)


Я бы поддержал предложение Хенка № 2: неспособность правильно закрыть соединения с базой данных. Если вы используете DataSet или DataReaders, отправляете встроенный SQL или вызываете хранимые процедуры, вы должны закрывать соединения в коде, когда вы их используете. Если вы не закроете подключение, количество доступных подключений будет постепенно исчерпано, и новые запросы к базе данных будут невозможны. Только после истечения достаточного количества сеансов пользователей и освобождения соединений другие пользователи могут установить соединение.

У вас есть точный симптом незакрытых соединений: у первых нескольких пользователей все работает нормально. Но постепенно, по мере того, как все больше пользователей входят в систему или по мере того, как первоначальные пользователи перемещаются по веб-приложению, открывая все больше подключений к базе данных, все блокируется.

Один из способов диагностировать это — использовать инструмент профилировщика базы данных (Profiler для SQL Server) для проверки подключений к базе данных по мере их открытия и закрытия.

person DOK    schedule 07.06.2009

Было бы полезно, если бы вы показали немного больше кода. С таким количеством информации это может быть что угодно. Я возьму 2 предположения:

1) У вас есть ограничение в 5 подключений либо к вашей базе данных, либо к ConnectionPooling.

2) Вы забыли закрыть (удалить) один или несколько объектов базы данных

person Henk Holterman    schedule 07.06.2009
comment
Да, похоже, что я не вызываю Dispose. Я также надеюсь, что Access не используется для БД. - person RichardOD; 07.06.2009