积极答复者
[求助]这段代码为什么SqlHelper老报错

问题
-
using (OleDbConnection aconn = new OleDbConnection(AConnStr)) { string tmpperID = "" ; string CmdStr = "" ; BaseTb mBaseTb = new BaseTb(); InfoTb mInfoTb = new InfoTb(); EducationTb mEducationTb = new EducationTb(); WorkTb mWorkTb = new WorkTb(); CmdStr = @"Select * From [Base] Where InPutStatus=false" ; OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(AConnStr, CmdStr); using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction(); while (OleDBdr.Read()) { mBaseTb.perID = OleDBdr["perID" ].ToString(); mBaseTb.UserName = OleDBdr["UserName" ].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID" ; SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID" , mBaseTb.perID)); } } }
为什么我这句运行时,SqlHelper老报错!
但是换成下面这样可以运行一会,过一段时间后就会提示"系统资源不足,无法完成请求的服务。"
using (OleDbConnection aconn = new OleDbConnection(AConnStr)) { string tmpperID = "" ; string CmdStr = "" ; BaseTb mBaseTb = new BaseTb(); InfoTb mInfoTb = new InfoTb(); EducationTb mEducationTb = new EducationTb(); WorkTb mWorkTb = new WorkTb(); CmdStr = @"Select * From [Base] Where InPutStatus=false" ; OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(AConnStr, CmdStr); while (OleDBdr.Read()) { using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction(); mBaseTb.perID = OleDBdr["perID" ].ToString(); mBaseTb.UserName = OleDBdr["UserName" ].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID" ; SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID" , mBaseTb.perID)); } } }
答案
-
using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction();
while(OleDBdr.Read()) { mBaseTb.perID = OleDBdr["perID" ].ToString(); mBaseTb.UserName = OleDBdr["UserName" ].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID" ; SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID" , mBaseTb.perID)); } } }- 已标记为答案 Allen Chen - MSFTModerator 2009年9月7日 8:08
-
// 1 aconn 声明了未使用 using (OleDbConnection aconn = new OleDbConnection(AConnStr)) { string tmpperID = ""; string CmdStr = ""; BaseTb mBaseTb = new BaseTb(); InfoTb mInfoTb = new InfoTb(); EducationTb mEducationTb = new EducationTb(); WorkTb mWorkTb = new WorkTb(); CmdStr = @"Select * From [Base] Where InPutStatus=false"; OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(AConnStr, CmdStr); // 2 这里应改为(如果有这种重载的话) OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(aconn, CmdStr); while (OleDBdr.Read()) { using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); // 3 Select 语句在大多数情况下都不需要使用事务 //SqlTransaction transaction = conn.BeginTransaction(); mBaseTb.perID = OleDBdr["perID"].ToString(); mBaseTb.UserName = OleDBdr["UserName"].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID"; //SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID", mBaseTb.perID)); // 4 这里应改为(如果有这种重载的话) // 5 既然 Select 语句应该调用 ExecuteDataSet 、 ExecuteDataTable 等方法,并且声明变量接收返回值 DataSet retDS = SqlHelper.ExecuteDataSet(conn, CommandType.Text, CmdStr, new SqlParameter("@perID", mBaseTb.perID)); } } OleDBdr.Close(); // 需要显示的关闭 DataReader }
知识改变命运,奋斗成就人生!- 已标记为答案 Allen Chen - MSFTModerator 2009年9月7日 8:08
全部回复
-
using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction();
while(OleDBdr.Read()) { mBaseTb.perID = OleDBdr["perID" ].ToString(); mBaseTb.UserName = OleDBdr["UserName" ].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID" ; SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID" , mBaseTb.perID)); } } }- 已标记为答案 Allen Chen - MSFTModerator 2009年9月7日 8:08
-
// 1 aconn 声明了未使用 using (OleDbConnection aconn = new OleDbConnection(AConnStr)) { string tmpperID = ""; string CmdStr = ""; BaseTb mBaseTb = new BaseTb(); InfoTb mInfoTb = new InfoTb(); EducationTb mEducationTb = new EducationTb(); WorkTb mWorkTb = new WorkTb(); CmdStr = @"Select * From [Base] Where InPutStatus=false"; OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(AConnStr, CmdStr); // 2 这里应改为(如果有这种重载的话) OleDbDataReader OleDBdr = AccessHelper.ExecuteReader(aconn, CmdStr); while (OleDBdr.Read()) { using (SqlConnection conn = new SqlConnection(SConnStr)) { conn.Open(); // 3 Select 语句在大多数情况下都不需要使用事务 //SqlTransaction transaction = conn.BeginTransaction(); mBaseTb.perID = OleDBdr["perID"].ToString(); mBaseTb.UserName = OleDBdr["UserName"].ToString(); CmdStr = @"Select * From [pH_Person_Base] Where perId=@perID"; //SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, CmdStr, new SqlParameter("@perID", mBaseTb.perID)); // 4 这里应改为(如果有这种重载的话) // 5 既然 Select 语句应该调用 ExecuteDataSet 、 ExecuteDataTable 等方法,并且声明变量接收返回值 DataSet retDS = SqlHelper.ExecuteDataSet(conn, CommandType.Text, CmdStr, new SqlParameter("@perID", mBaseTb.perID)); } } OleDBdr.Close(); // 需要显示的关闭 DataReader }
知识改变命运,奋斗成就人生!- 已标记为答案 Allen Chen - MSFTModerator 2009年9月7日 8:08