ADO.NET 连接错误“System.Data.OleDb.OleDbException”

Posted

技术标签:

【中文标题】ADO.NET 连接错误“System.Data.OleDb.OleDbException”【英文标题】:ADO.NET connection error "System.Data.OleDb.OleDbException" 【发布时间】:2009-06-07 17:58:12 【问题描述】:

我在尝试连接我的网站时收到此错误。

未指定的错误描述:一个 期间发生未处理的异常 当前网络的执行 要求。请查看堆栈跟踪 有关错误的更多信息 以及它起源于代码的位置。

异常详情: 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 事件的 STATISTICS

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;

然后在 Default.aspx 中有 2 个部分;它在新闻和文章的页面加载事件中加载。

    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 查询。如果这是我的问题,还有其他方法吗?

【问题讨论】:

【参考方案1】:

如果您显示更多代码会有所帮助。有了这么多信息,它可以是任何东西。我会猜2个:

1) 您的 Db 或 ConnectionPooling 中的连接数限制为 5 个

2) 您忘记关闭(处置)一个或多个数据库对象

【讨论】:

是的,听起来好像没有调用 Dispose - 我也希望 Access 没有被用于数据库。【参考方案2】:

我会赞同 Henk 的 #2 建议:未能正确关闭数据库连接。如果您使用 DataSets 或 DataReaders、发送内联 SQL 或调用存储过程,则必须在使用完它们后关闭代码中的连接。如果不关闭连接,则可用连接数逐渐达到最大值,并且无法发出新的数据库请求。只有当足够多的用户会话超时并释放连接后,其他用户才能获得连接。

您有未关闭连接的确切症状:对于最初的几个用户来说一切正常。但渐渐地,随着更多用户登录,或者随着原始用户在 Web 应用程序中移动,打开更多数据库连接,一切都锁定了。

诊断此问题的一种方法是使用数据库分析器工具(SQL Server 分析器)在打开和关闭数据库连接时检查它们。

【讨论】:

以上是关于ADO.NET 连接错误“System.Data.OleDb.OleDbException”的主要内容,如果未能解决你的问题,请参考以下文章

具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序未注册

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

无法加载具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序

基于ADO.NET的SqlHelper类

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。