1.The problem is genrated by the fact that your
SqlDataAdapter
object is using internally a
DataReader
object for reading the data, but you have just created a reader (by using
ExecuteReader
) before to read the data by using adapter.
2.The solution is to
ExecuteRedear
after the usage of the
SqlDataAdapter
, like in the next example:
public DataTable FillData(SaleOrderBEL SaleBEL)
{
if (cn.State != ConnectionState.Open)
cn.Open();
cmd = new SqlCommand("SP_SalesOrder_FillData", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@comp_id", SaleBEL.comp_id);
cmd.Parameters.AddWithValue("@so_no", SaleBEL.so_no);
cmd.Parameters.AddWithValue("@sod_deleted", SaleBEL.sod_deleted);
if (dr.IsClosed == false) dr.Close();
sda = new SqlDataAdapter(cmd);
ds = new DataSet();
sda.Fill(ds, "so_details");
dr = cmd.ExecuteReader();
while (dr.Read())
{
object[] obj = { dr["sod_order"].ToString(),"", dr["prod_code"].ToString(), dr["prod_desc"].ToString(), dr["sod_qty"].ToString(),
dr["sod_uom"].ToString(), dr["sod_uprice"].ToString(), dr["sod_gstamt"].ToString(),
dr["sod_disc"].ToString(), dr["sod_netamount"].ToString(),"",dr["sod_qty_reserve"].ToString() };
dt = ds.Tables[0];
dt.Rows.Add(obj);
}
dr.Close();
cn.Close();
return dt;
}