小弟做了一个小项目,对数据表进行多次操作时,后一次操作提示数据表被锁定,无法进行下去,请牛人帮我看看。给个解决方法。
技术.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"分支时就会产生错误,系统提示说相应的数据表被其他用户或进程锁定,无法进行操作。调试了半天也没法先是由什么地方引起的错误,请各位高手帮忙看看。
技术.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"分支时就会产生错误,系统提示说相应的数据表被其他用户或进程锁定,无法进行操作。调试了半天也没法先是由什么地方引起的错误,请各位高手帮忙看看。
string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb";
同步默认情况下是假,因此要显示指定。不能同步的话,DATAREADER在读取结束前是不允许,对数据库操作的。
string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb;MutipleActiveResultSets=true";
{
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;
}
但是如果这么写:string M_str_sqlcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#####\\####.mdb;MutipleActiveResultSets=true";
则会提示:无法查找可安装 ISAM
这么回事?