读取器关闭时无效尝试调用MetaData?

我正在从datareader运行if else语句来查询表数据并激活/取消激活页面上的某些控件。 当我关闭块时,我实现了一个using语句来自动关闭连接和读取器,但是我的每个if else语句仍然会让读者关闭错误。 少了什么东西? 代码如下:

string comnt = "SELECT StatusId FROM Submission WHERE SubmissionId =" + x; using (SqlConnection editConn = new SqlConnection(connectionString)) { editConn.Open(); using (SqlCommand statCmd = new SqlCommand(comnt, editConn)) { SqlDataReader dr = statCmd.ExecuteReader(); dr.Read(); if (dr.GetInt32(0) > 0) { PanelComment.Visible = true; PanelQuote.Visible = false; LnbFid.Visible = false; LnbCrim.Visible = false; LnbEo.Visible = false; LnbEpl.Visible = false; LnbNot.Visible = false; LnbPriv.Visible = false; LnbPub.Visible = false; } else { PanelComment.Visible = false; } } 

您的查询未获得任何结果。 如果您不确定您的查询是否会返回任何数据,请习惯以下构造:

 while (dr.Read()) //will return true while there is data to be read. { ... } 

试试这种方式:

 if (dr.HasRows) { while (dr.Read()) { if (dr.GetInt32(0) > 0) { ... } } } 

有关详细信息,请查看此页面:

使用DataReader检索数据

似乎select语句没有返回任何行,当你第一次调用dr.Read()时,数据读取器会因为使用数据读取器而无法关闭,我们总是会显示使用if或者像leniel所说的那样

  using (SqlCommand statCmd = new SqlCommand(comnt, editConn)) { SqlDataReader dr = statCmd.ExecuteReader(); if( dr.Read()) if (dr.GetInt32(0) > 0) { PanelComment.Visible = true; PanelQuote.Visible = false; LnbFid.Visible = false; LnbCrim.Visible = false; LnbEo.Visible = false; LnbEpl.Visible = false; LnbNot.Visible = false; LnbPriv.Visible = false; LnbPub.Visible = false; } else { PanelComment.Visible = false; } } 

由于读者姓名不匹配,我遇到了这个问题。 即

 SqlCommand sqlmd = new SqlCommand(); SqlDataReader sqldr = sqlmd.ExecuteReader(); while (sqldr.Read()) { idd = (int)rdr["Id"]; } 

后来我更换了代码

  idd = (int)sqldr["Id"]; 

并且错误已经解决。

 if (conn.State == ConnectionState.Closed) conn.Open(); SqlCommand qr1 = new SqlCommand("select TransID, FType, FldName, LTrans, OnCCBeforeLoad, LTop, LLeft, LWidth, LHeight, LFColor from jwOndropExecButtonS where active = 'T' and MyType = '' and LTrans = '" + TmpRajTransID + "' order by dbo.val(TransID) ", conn); SqlDataReader d1 = qr1.ExecuteReader(); while (d1.Read()) { if (d1.HasRows) { string MrFldName = d1["FldName"].ToString().Trim(); if (d1["OnCCBeforeLoad"].ToString().Trim() == "Clr") ClearValueandToolTipforFieldName(MrFldName); if (d1["LTop"].ToString().Trim() != "") DisplaySetTopValue(MrFldName, d1["LTop"].ToString().Trim()); if (d1["LLeft"].ToString().Trim() != "") DisplaySetLeftValue(MrFldName, d1["LLeft"].ToString().Trim()); if (d1["LWidth"].ToString().Trim() != "") DisplaySetWidthValue(MrFldName, d1["LWidth"].ToString().Trim()); if (d1["LHeight"].ToString().Trim() != "") DisplaySetHeightValue(MrFldName, d1["LHeight"].ToString().Trim()); if (d1["FType"].ToString().Trim() == "Visible") ShowTextBoxWithFldName(MrFldName); if (d1["FType"].ToString().Trim() == "InVisible") HideandClearTextBoxWithFldName(MrFldName); if (d1["FType"].ToString().Trim() == "InNVisible") HideOnlyTextBoxWithFldName(MrFldName); if (d1["FType"].ToString().Trim() == "Enable") SetEnableforFieldName(MrFldName); if (d1["FType"].ToString().Trim() == "Disable") SetDisableforFieldName(MrFldName); } } d1.Close(); if (conn.State == ConnectionState.Open) conn.Close(); 

我偶尔会遇到同样的错误

 if (d1["FType"].ToString().Trim() == "Visible") 

metadata not found 。 后来我发现读者没有关闭,但是使用太多内存的ASP.NET程序会自动关闭阅读器。 它主要取决于SQL Server阶段。 如果是常规错误,请检查您的连接。