PDA

View Full Version : خطای There is already an open DataReader associated with this Command which must be closed first.



r_mehrizi
چهارشنبه 10 آذر 1389, 15:10 عصر
یک پروژه نوشتم که خطای زیر رامیده این خطا هم زمانی پیش میاد که دو کاربر همزمان به برنامه که تحت وب هست کانکت میشن

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
at System.Data.SqlClient.SqlInternalConnectionTds.Val idateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlConnection.ValidateConnec tionForExecute(String method, SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(S tring method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader( CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader( CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(Com mandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataRead er(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbComman d.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(Data Set dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at BBS.DBOperator.OperateGetDataTable(String StoredProcedureName, SqlParameter[]& SqlParameters) in C:\Inetpub\wwwroot\BBS\BBSDAL\DBOperator.cs:line 291

کدهایی هم که نوشتم به شکل زیر هستش بدجوری توش گیر افتادم خواهشا راهنمایی کنید







public class DBOperator
{


private static SqlConnection con = null;
private static SqlConnection Archivcon = null;
static readonly object padlock = new object();
static readonly object padlock_Archiv = new object();
private static ConnectionState conState = ConnectionState.Executing;
private static Boolean ProjectType;

public DBOperator()
{
//lock (padlock)
//{
if (con == null)
{
XmlDocument doc = new XmlDocument();
try
{

doc.Load("appConfig.xml");
XmlNodeList node = doc.GetElementsByTagName("ConnectionString");
string conStr = node[0].InnerText;
//conStr



Encryptor encryptor = new Encryptor("YaBaBalHavaeJ8#3)");
try
{
conStr = encryptor.Decrypt(conStr.Trim());


}
catch (Exception ex)
{


}

ProjectType = true;
con = new SqlConnection(conStr);

}
catch (Exception)
{
Page pg = new Page();
doc.Load(pg.Server.MapPath("~/appConfig.xml"));
XmlNodeList node = doc.GetElementsByTagName("ConnectionString");
string conStr = node[0].InnerText;
con = new SqlConnection(conStr);

ProjectType = false;
}

//}
}
//lock (padlock_Archiv)
//{
if (Archivcon == null)
{
XmlDocument doc = new XmlDocument();
try
{

doc.Load("ArchivappConfig.xml");
XmlNodeList node = doc.GetElementsByTagName("ConnectionString");
string ArchivconStr = node[0].InnerText;
//conStr



Encryptor encryptor = new Encryptor("YaBaBalHavaeJ8#3)");
try
{
ArchivconStr = encryptor.Decrypt(ArchivconStr.Trim());


}
catch (Exception ex)
{


}

ProjectType = true;
Archivcon = new SqlConnection(ArchivconStr);

}
catch (Exception)
{
Page pg = new Page();
doc.Load(pg.Server.MapPath("~/ArchivappConfig.xml"));
XmlNodeList node = doc.GetElementsByTagName("ConnectionString");
string ArchivconStr = node[0].InnerText;
Archivcon = new SqlConnection(ArchivconStr);

ProjectType = false;
}

//}

}

}
public static string GetConnectionString()
{

return con.ConnectionString.ToString();
}

public static SqlConnection GetConnectionString_new()
{

return con;
}





public static DataSet OperateGetDataSet(string StoredProcedureName, ref SqlParameter[] SqlParameters)
{
try
{
SqlDataAdapter cmd = new SqlDataAdapter(StoredProcedureName, con);
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd.SelectCommand.Parameters.Clear();
cmd.SelectCommand.Parameters.AddRange(SqlParameter s);
cmd.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
cmd.Fill(ds);
if (con.State != ConnectionState.Closed)
{
con.Close();
cmd.Dispose();
}
return ds;
}
catch (Exception e)
{
con.Close();
System.IO.File.AppendAllText(@"C:\Inetpub\wwwroot\BBS\Operate.txt", "error : " + StoredProcedureName + "\r\n");
System.IO.File.AppendAllText(@"C:\Inetpub\wwwroot\BBS\Operate.txt", "e : " + e + "\r\n");
return null;
}
}


public static DataTable OperateGetDataTable(string StoredProcedureName, ref SqlParameter[] SqlParameters)
{
try
{
//GetConnectionString_new();
SqlDataAdapter cmd = new SqlDataAdapter(StoredProcedureName, con);
////////////change//////
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd.SelectCommand.Parameters.Clear();
cmd.SelectCommand.Parameters.AddRange(SqlParameter s);
cmd.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable ds = new DataTable();
//cmd.SelectCommand.CommandTimeout = 50000;

cmd.Fill(ds);
if (con.State != ConnectionState.Closed)
{
con.Close();
cmd.Dispose();
}
return ds;
}
catch (Exception e )
{
//string exMsg = "Message:" + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace;
//TextWriter tw = new StreamWriter(@"c:\inetpub\wwwroot\BBS\BBSDAL\Log.txt");
//tw.WriteLine(exMsg);
//tw.Close();

con.Close();
System.IO.File.AppendAllText(@"C:\Inetpub\wwwroot\BBS\Operate.txt", "error : " + StoredProcedureName + "\r\n");
System.IO.File.AppendAllText(@"C:\Inetpub\wwwroot\BBS\Operate.txt", "e : " + e + "\r\n");
return null;
}
}

taghi.km
پنج شنبه 11 آذر 1389, 08:58 صبح
اون خطی که خطا میده رو میشه مشخص کنی

sara70
پنج شنبه 11 آذر 1389, 10:16 صبح
سلام

متن برنامتون رو نخوندم. اما این پیام به خاطر این است که DataReader مستقیما از روی پایگاه داده اطلاعات را می خونه. وقتی کارتون باهاش تمام شد حتما باید اتصال به پایگاه داده را ببندید و برای کار دوباره روی پایگاه داده آن راopen کنید.
موفق باشید

alonemm
پنج شنبه 11 آذر 1389, 10:57 صبح
شما میتونید با دستور Datareader.Dispose
این کار رو انجام بدید.