可能重复:
Invalid attempt to call FieldCount when reader is closed
我正在使用带有c#的asp.net。 我试图在aspx2.cs上的finally语句中关闭连接。
在aspx1.cs中:
private void BindDataGrids()
{
try
{
DataGrid1.DataSource = instance.ShowDifferences(Convert.ToInt32(Request.QueryString
["CrewId"]), DateTime.Parse(Request.QueryString["StartDate"]), DateTime.Parse(Request.QueryString["EndDate"]));
DataGrid1.DataBind();
}
}
在aspx2.cs中:
public static SqlDataReader ShowDifferences(int crewID, DateTime date1, DateTime date2)
{
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "stored_procedure";
DBCommandWrapper command = db.GetStoredProcCommandWrapper(sqlCommand);
try
{
........code...........
command.AddInParameter("@EndDate", DbType.Date, date2);
IDataReader reader = db.ExecuteReader(command);
return (SqlDataReader)reader;
}
finally
{
command.Command.Connection.Close();
}
当它到达DataGrid1.DataBind()时;在aspx1.cs。
我收到错误:
"Invalid attempt to FieldCount when reader is closed error"
如何解决这个问题?
答案 0 :(得分:4)
您要返回一个需要打开连接的阅读器才能Read
,但在ShowDifferences
退出之前关闭连接。读者是光标,以递增方式获取数据,并且必须连接到数据库以进行整个读取过程。如果要将内存数据集(DataTable
)与后端数据库断开连接,请考虑使用Fill
的{{1}}方法。
<强>更新强>
“在SqlDataAdapter
”移动线后关闭连接
DataGrid1.DataBind();
单独使用command.Command.Connection.Close();
类的方法(例如instance
)并致电
CloseConnection
在instance.CloseConnection();
之后。当然,为此,您需要将DataGrid1.DataBind();
更改为DBCommandWrapper command
的班级成员。
答案 1 :(得分:2)
使用DbDataReader
时必须打开连接,ExecuteReader不会自动打开它。像这样:
using (DbConnection conn = factory.CreateConnection())
{
conn.ConnectionString = connString;
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "...";
conn.Open();
DbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{ ...
}
}
只有当您使用DataSet
时,您才不必处理连接。如果您真的在ExecuteReader方法中打开连接,只要保留读者,就必须保持打开状态。