问题
I have a gridview whose value for a column
<asp:HyperLinkField DataNavigateUrlFields="runId" DataTextField="PercentAnalysed" ControlStyle-CssClass="hlink" HeaderText="% ANALYSED" ItemStyle-Width="6%" DataNavigateUrlFormatString="runanalysis.aspx?runId={0}" ItemStyle-Font-Underline="true"/>
is decided by the below code.
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
GridViewRow item = e.Row;
//int myvar;
//Int32.TryParse(item.Cells[0].Text, out myvar);
SqlConnection con = new SqlConnection(connectionstring.ToString());
string selectSQL = " SELECT COUNT(*) AS 'Count' FROM Analysed WHERE runId =@myvar group by runId";
SqlCommand cmd = new SqlCommand(selectSQL, con);
cmd.Parameters.AddWithValue("@myvar", item.Cells[0].Text);
SqlDataReader reader;
try
{ con.Open();
reader = cmd.ExecuteReader();
reader.Read();
if (item.Cells[8].Text.Equals("0"))
item.Cells[13].Text = "0";
else
{
if (reader["Count"].ToString().Equals("0"))
item.Cells[13].Text = "0";
else
item.Cells[13].Text = reader["Count"].ToString();
reader.Close();
}
}
finally
{
con.Close();
}
}
}
I tried debugging it and it gives this exception.
The exception also says additionally that I am trying to read a value when no value is present.
I executed the query separately and the results are fine but for some cases no data is present. So I inserted this check :
if (reader["Count"].ToString().Equals(""))
but still the same exception.
Any idea ?
Also,I just experimented with some dummy value.The column gets that value but it is very weird that it is no more a hyperlink.
回答1:
if (reader["Count"].ToString().Equals("")) will also try to read the data. SO you have to check "reader.HasRows()" before you try to read it.
Might not be mandatory, but I think you should consider below comments I am making.
Code Review :)
if (e.Row.RowType == DataControlRowType.DataRow)
{
GridViewRow item = e.Row;
// Consider this condition here. No need to execute connection and command if u hard coding the value
if (item.Cells[8].Text.Equals("0"))
{
item.Cells[13].Text = "0";
return;
}
// You should always try to do this thing in using?
//using (var sqlConnection = new SqlConnection(connectionstring)
SqlConnection con = new SqlConnection(connectionstring.ToString());
string selectSQL = " SELECT COUNT(*) AS 'Count' FROM Analysed WHERE runId =@myvar group by runId";
SqlCommand cmd = new SqlCommand(selectSQL, con);
cmd.Parameters.AddWithValue("@myvar", item.Cells[0].Text);
SqlDataReader reader;
try
{ con.Open();
// What about using command behaviour here?? e.g., command.ExecuteReader(CommandBehavior.CloseConnection)
reader = cmd.ExecuteReader();
if(reader.HasRows())
{
reader.Read();
//if (item.Cells[8].Text.Equals("0")) // this check should go as first thing in method
//item.Cells[13].Text = "0";
//else
//{
if (reader["Count"].ToString().Equals("0"))
item.Cells[13].Text = "0";
else
item.Cells[13].Text = reader["Count"].ToString();
reader.Close();
//}
}
}
finally
{
con.Close();
}
来源:https://stackoverflow.com/questions/28987872/an-exception-of-type-system-invalidoperationexception-occurred-in-system-data