Неправильная попытка вызова MetaData, когда читатель закрыт? - PullRequest
5 голосов
/ 30 мая 2011

Я запускаю оператор 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;
            }

        } 

Ответы [ 5 ]

3 голосов
/ 30 мая 2011

Ваш запрос не возвращает никаких результатов. Привыкните к следующей конструкции, если вы не уверены, вернет ли ваш запрос какие-либо данные:

while (dr.Read()) //will return true while there is data to be read.
{
    ...
}
3 голосов
/ 30 мая 2011

Попробуйте так:

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

Для получения дополнительной информации, проверьте эту страницу:

Получение данных с использованием DataReader

1 голос
/ 08 ноября 2012

Я столкнулся с этой проблемой из-за несоответствия имени читателя. т.е.

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

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

позже я заменил код

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

и ошибка была устранена.

1 голос
/ 30 мая 2011

Кажется, что оператор SELECT не возвращает строки, и когда вы вызываете dr.Read () для первого раза, устройство чтения данных будет немедленно закрыто для использования устройства чтения данных, которое мы всегда показываем как, если или как то, что сказал 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;
        }

    }
0 голосов
/ 18 октября 2014
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. Если это обычная ошибка, проверьте соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...