Не удается преобразовать группу методов «Чтение» в неделегатный тип «bool»

Я пытаюсь использовать SqlDataReader, чтобы проверить, существует ли запись. Если он существует, он вернет идентификатор, иначе он вернет false. Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке «Не удается преобразовать группу методов« Чтение »в неделегатный тип« bool ». Я следовал примеру, который нашел в VB, но кажется, что перевод может быть неправильным.

private string checkProfileExists()
{
    string strReturn = "False";
    string strSql = ("SELECT ID FROM tblInformation WHERE txtUsername=@UserName " + 
        "AND TrackingID=@TrackingID");
    string strConn = ConfigurationManager.ConnectionStrings["WEM_PassWord_Reset"].
        ConnectionString;


    SqlConnection objConn = new SqlConnection(strConn);
    SqlCommand objCmd = new SqlCommand(strSql, objConn);

    objCmd.Parameters.AddWithValue("@Username", txtUsername.Text);
    objCmd.Parameters.AddWithValue("@TrackingID", txtTrackingID.Text);

    try
    {
        objConn.Open();
        System.Data.SqlClient.SqlDataReader rdr = objCmd.ExecuteReader();

        if (rdr.Read)
        {
            strReturn = rdr("ID").ToString;
        }
        else
        {
            strReturn = "False";
        }
    }
    catch (Exception ex)
    {
        lblErrorMessage.Text = ex.ToString();
    }
    finally
    {
        objConn.Close();
        objCmd = null;
    }

    return strReturn;
}

person Jason    schedule 03.02.2011    source источник
comment
Вы, ребята, закрываете вопросы из-за того, что они слишком расплывчаты или слишком открыты, а также из-за того, что они слишком локализованы? Почему это может быть проблемой? Поиск решения этой проблемы привел меня к этому вопросу, и это помогло мне.   -  person Soulzityr    schedule 17.12.2018


Ответы (4)


Когда вы видите фразу «группа методов» в ошибке C#, одно из объяснений, которое следует учитывать, состоит в том, что вы пропустили круглые скобки () в методе, который не принимает аргументов. В этом случае метод Read на вашем DataReader.

Когда компилятор видит Read (без скобок), он думает, что вы говорите о самом методе, как будто пытаетесь присвоить его, скажем, делегату. В то время как то, что вы на самом деле хотите сделать, это вызвать метод — для этого в C# вы должны указать список аргументов (который в данном случае пуст), таким образом: Read().

person AakashM    schedule 03.02.2011

Символ () для вызова методов без параметров не является обязательным в C#. Без круглых скобок выражение идентифицирует метод (группу), а не его значение результата. Такое поведение делает грамматику менее двусмысленной, особенно для методов, возвращающих делегаты.

Первой реакцией программиста на C#, когда он видит «Невозможно преобразовать группу методов '...' в неделегатный тип '...'», обычно является «О, я забыл свой () для вызова».

person CodesInChaos    schedule 03.02.2011

Увидев ваш источник, я настоятельно рекомендую использовать оператор using как для SqlConnection, так и для SqlDataReader.

Если вы НЕ закроете средство чтения, момент завершения работы определит момент сборки мусора. Вы можете отключить SqlServer, если не знаете этого.

person Edmond De Savornin Lohman    schedule 16.06.2013

person    schedule
comment
Read — это метод класса SqlDataReader, который в данном случае не принимает параметры. - person Jhonny D. Cano -Leftware-; 03.02.2011
comment
@Jhonny в C# для вызова методов всегда требуются круглые скобки, даже если они не принимают параметров - person AakashM; 03.02.2011
comment
спасибо за помощь, теперь, когда я вижу это, это имеет смысл - person Jason; 03.02.2011
comment
Да, но он четко заявил, что этот фрагмент кода был переводом с VB. Я подумал, что было бы неплохо немного расширить объяснение, а не просто указать пальцем на ошибку, потому что компилятор уже сделал это. - person Jhonny D. Cano -Leftware-; 04.02.2011