小弟做了一个小项目,对数据表进行多次操作时,后一次操作提示数据表被锁定,无法进行下去,请牛人帮我看看。给个解决方法。
技术.net2.0;语言:c#;数据库:access2003。
相关代码如下:switch (e.CommandName)
        {            case "view": Response.Redirect("View.aspx?tableName="+index.Trim());   break;
            case "edit": Response.Redirect("Edit.aspx?tableName=" + index.Trim()); break;
            case "delete":
                Response.Write("<script>alert('您确定要删除数据吗?');</script>");
                bop.getcom("drop table " + index.Trim());
                bop.getcom("delete from exam_course where id= " + (e.Item.Controls[1] as Label).Text.Trim());
                Response.Redirect("Teachermanage.aspx");
                break;
            case "publish":
                if (equalScore(e) == 1) 
                { 
                    bop.getcom("update exam_course set state='已发布' where id=" + (e.Item.Controls[1] as Label).Text.Trim() + "");
                    Response.Write("<script>alert('试卷发布成功!')</script>");
                }
                else Response.Write("<script>alert('分数不相等,无法发布!')</script>");
                break;
                
        }
    被调用的方法:equalScore
    #region
    /// <summary>
    /// 用于比较设置分数和实际分数是否一致
    /// </summary>
    /// <param name="e">RepeaterCommandEventArgs</param>
    /// <returns>一个int数值,一致返回1,否则0</returns>    protected int equalScore(RepeaterCommandEventArgs e)
    {
        float i = 0,j=0;
        
        DBClass dbop = new DBClass();
        OleDbDataReader oledr = dbop.getread("select score from question_"+(e.Item.Controls[1] as Label).Text.Trim() + "");
        try
        {
            while (oledr.Read())
            {
            i +=float.Parse(oledr.GetValue(0).ToString());
            }
        }
        catch (Exception ep)
        {
            Response.Write(ep.Message); Response.Write(oledr.GetValue(0).ToString());
        }
        OleDbDataReader newdr = dbop.getread("select score from exam_course where id=" + (e.Item.Controls[1] as Label).Text.Trim() + "");
        if (newdr.Read()) { j = newdr.GetInt16(0); }
        else return 0;
        if (i == j) return 1;
        else return 0;
}
    数据库操作类代码:using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.OleDb;/// <summary>
///DBClass 的摘要说明
/// </summary>
public class DBClass
{
public DBClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    #region  建立数据库连接
    /// <summary>
    /// 建立数据库连接.
    /// </summary>
    /// <returns>返回SqlConnection对象</returns>
    public OleDbConnection getcon()
    {
        string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb";
        OleDbConnection myCon = new OleDbConnection(M_str_sqlcon);
        return myCon;
    }
    #endregion    #region  执行SqlCommand命令
    /// <summary>
    /// 执行SqlCommand
    /// </summary>
    /// <param name="M_str_sqlstr">SQL语句</param>
    public void getcom(string M_str_sqlstr)
    {
        OleDbConnection olecon = this.getcon();
        olecon.Open();
        OleDbCommand olecom = new OleDbCommand(M_str_sqlstr, olecon);
        olecom.ExecuteNonQuery();
        olecom.Dispose();
        olecon.Close();
        olecon.Dispose();
    }
    #endregion    #region  创建DataSet对象
    /// <summary>
    /// 创建一个DataSet对象
    /// </summary>
    /// <param name="M_str_sqlstr">SQL语句</param>
    /// <param name="M_str_table">表名</param>
    /// <returns>返回DataSet对象</returns>
    public DataSet getds(string M_str_sqlstr, string M_str_table)
    {
        OleDbConnection sqlcon = this.getcon();
        OleDbDataAdapter sqlda = new OleDbDataAdapter(M_str_sqlstr, sqlcon);
        DataSet myds = new DataSet();
        sqlda.Fill(myds, M_str_table);
        return myds;
    }
    #endregion    #region  创建SqlDataReader对象
    /// <summary>
    /// 创建一个SqlDataReader对象
    /// </summary>
    /// <param name="M_str_sqlstr">SQL语句</param>
    /// <returns>返回SqlDataReader对象</returns>
    public OleDbDataReader getread(string M_str_sqlstr)
    {
        OleDbConnection sqlcon = this.getcon();
        OleDbCommand sqlcom = new OleDbCommand(M_str_sqlstr, sqlcon);
        sqlcon.Open();
        OleDbDataReader sqlread = sqlcom.ExecuteReader(CommandBehavior.CloseConnection);
        return sqlread;
    }
    #endregion
}
说明:
网页端使用了一个Repeater控件,其中嵌套有Button数个,分别设定了CommandName属性,后台根据这个属性来进行不同的操作(代码中的switch语句)。
问题:当单独执行任何一个case分支时,都可以正常执行,没有问题。
      但当先执行完case "publish" 分支,再执行case "delete"分支时就会产生错误,系统提示说相应的数据表被其他用户或进程锁定,无法进行操作。调试了半天也没法先是由什么地方引起的错误,请各位高手帮忙看看。

解决方案 »

  1.   

    估计是你在用READER阅读器的过程中,又对数据库操作,你只要在下面的链接字符串中加一个允许同步的属性就行了
    string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb";
    同步默认情况下是假,因此要显示指定。不能同步的话,DATAREADER在读取结束前是不允许,对数据库操作的。
      

  2.   

    可是执行完DataReader后数据连接应该是立即被中断了才对呀。
      

  3.   

    如果你在阅读器没关闭前,就对数据库进行其他操作,比如数据库查询。你把你的连接字符串改成下面的:
    string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb;MutipleActiveResultSets=true";
      

  4.   

    要不就是你没关闭阅读器,导致你后面的数据库操作都没办法进行,但是像上面加上MARS属性就可以了!
      

  5.   

    reader 用完要马上关闭,你的两个reader都没关
      

  6.   

    但是我用了OleDbDataReader类的close()方法,效果都是一样的。
      

  7.   

    protected int equalScore(RepeaterCommandEventArgs e)
        {
            float i = 0,j=0;
            
            DBClass dbop = new DBClass();
            OleDbDataReader oledr = dbop.getread("select score from question_"+(e.Item.Controls[1] as Label).Text.Trim() + "");
            try
            {
                while (oledr.Read())
                {
                i +=float.Parse(oledr.GetValue(0).ToString());
                }
                oledr.close();//这是后添加的
            }
            catch (Exception ep)
            {
                Response.Write(ep.Message); Response.Write(oledr.GetValue(0).ToString());
            }
            OleDbDataReader newdr = dbop.getread("select score from exam_course where id=" + (e.Item.Controls[1] as Label).Text.Trim() + "");
            if (newdr.Read()) { j = newdr.GetInt16(0);newdr.close();//后来添加的 }
            else return 0;
            if (i == j) return 1;
            else return 0;
    }
      

  8.   

    经过再次调试,只要关闭数据库连接,就可以了。
    但是如果这么写:string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb;MutipleActiveResultSets=true";
    则会提示:无法查找可安装 ISAM
    这么回事?
      

  9.   

    额 貌似Access数据库不允许有MARS属性,推荐用SQL