读取器关闭时无效尝试调用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阶段。 如果是常规错误,请检查您的连接。