Invalid attempt to call MetaData when reader is closed?

▼魔方 西西 提交于 2020-01-24 04:23:06

问题


I'm running an if else statement off of a datareader to query table data and activate/de-activate some controls on a page. I implemented a using statement to automatically close the connection and the reader when I close the block, but I still get the reader is closed error on each of my if else statements. What's missing? Code below:

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;
            }

        } 

回答1:


Your query is not getting any results back. Get used to the following construct if you are not sure if your query will return any data:

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



回答2:


Try this way:

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

For more info, check this page:

Retrieving Data Using a DataReader




回答3:


It seems the select statement returns no row and when you call dr.Read() for first time datareader will be closed imidiately for using data reader we always shows use if or while like what leniel said

   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;
        }

    }



回答4:


I faced this problem due to mismatch of reader name. i.e.

SqlCommand sqlmd = new SqlCommand();
SqlDataReader sqldr = sqlmd.ExecuteReader();
while (sqldr.Read())
{

    idd = (int)rdr["Id"];
}

later I replaced the code

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

and the error was solved.




回答5:


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();

I got the same error once in a while at

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

saying metadata not found. Later I found that the reader was not closed, but the ASP.NET program using too much memory closed the reader automatically. It mainly depends on the SQL server stage. If it is a regular error then please check your connection.



来源:https://stackoverflow.com/questions/6179139/invalid-attempt-to-call-metadata-when-reader-is-closed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!