I am having Invalid attempt to call Read when reader is closed error when I am doing 3 tier project in C# language. What I am trying to do is retrieve address data column by
It doesn't work because you close the connection before returning the reader. Reader works only when the connection is open:
result = command.ExecuteReader();
connection.Close();
return result; // here the reader is not valid
Generally speaking, you should not be returning a reader to a business layer. Reader should be used only in the data access layer. It should be used and then it and the connection should be closed.
You should rather return an object that can work after the connection is closed, e.g. a DataSet
or DataTable
or alternatively a collection of DTO's. For example:
public List<Distribution> getDistributionAll()
{
List<Distribution> distributionAll = new List<Distribution>();
using (var connection = new SqlConnection(FoodBankDB.GetConnectionString())) // get your connection string from the other class here
{
SqlCommand command = new SqlCommand("SELECT b.addressLineOne FROM dbo.Beneficiaries b INNER JOIN dbo.Distributions d ON d.beneficiary = b.id", connection);
connection.Open();
using (var dr = command.ExecuteReader())
{
while (dr.Read())
{
string address = dr["addressLineOne"].ToString();
distributionAll.Add(new Distribution(address));
}
}
}
return distributionAll;
}
Previous one is a good example ... But you can also accomplish it by below code which is automatically
close a connection
instance when datareader.close()
method called ...
reader = Sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);