2009-06-07 82 views
1

嗨,我試圖連接我的網站時出現此錯誤。ADO.NET連接問題

未指定的錯誤描述:期間 當前web 請求的執行時發生 未處理的異常。請查看堆棧跟蹤 以獲取有關錯誤 以及源代碼的詳細信息。

異常詳細信息: System.Data.OleDb.OleDbException: 未指定的錯誤。

也許我在打開和關閉connection.I總是得到這個錯誤,如果5-10用戶輸入同一時間到site.When用戶輸入網站我正在更新或插入新的統計記錄?

// IAM使用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節。 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查詢在每個頁面加載事件。如果這是我的問題,還有另一種完成這件事的方法嗎?

thanx everyone。

+0

你正在使用什麼數據庫? – RichardOD 2009-06-07 18:59:39

+0

iam使用ms訪問數據庫 – 2009-06-07 19:58:53

回答

1

我會第二次亨克的#2建議:未能正確關閉數據庫連接。如果您正在使用DataSets或DataReaders,發送內聯SQL或調用存儲過程,則必須在完成代碼時關閉代碼中的連接。如果不關閉連接,則可用連接的數量將逐漸增大,並且不會創建新的數據庫請求。只有在足夠的用戶會話超時並且連接被釋放後,其他用戶才能獲得連接。

您具有未關閉連接的確切症狀:對於前幾個用戶,一切正常。但隨着越來越多的用戶登錄,或者隨着原來的用戶移動Web應用程序,開放更多的數據庫連接,逐漸鎖定所有東西,逐漸變得越來越困難。

診斷此問題的一種方法是使用數據庫分析器工具(Profiler for SQL Server)在打開和關閉數據庫連接時檢查它們。

2

如果你展示了更多的代碼,這將有所幫助。有了這麼多的信息,它可以是任何東西。我會帶2個猜測:

1)您有5個連接的限制,無論是在您的數據庫或ConnectionPooling

2)你忘了關(處置)一個或多個數據庫對象