【问题标题】:Cannot convert method group 'Read' to non-delegate type 'bool'无法将方法组“读取”转换为非委托类型“布尔”
【发布时间】:2011-02-03 18:46:19
【问题描述】:

我正在尝试使用SqlDataReader 检查条目是否存在。如果存在,则返回 ID,否则返回 false。当我尝试编译时,我收到错误“无法将方法组 'Read' 转换为非委托类型 '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;
}

【问题讨论】:

  • 你们因为过于模糊或过于开放以及过于本地化而结束了问题?为什么会有问题?希望解决这个问题让我想到了这个问题,它对我有帮助。

标签: c# sql sqldatareader


【解决方案1】:

当您在 C# 错误中看到短语“方法组”时,需要考虑的一种解释是您在不带参数的方法中省略了括号 ()。在这种情况下,方法是您的DataReader 上的Read

当编译器看到Read(没有括号)时,它会认为您在谈论方法本身,就好像试图将其分配给委托一样。而您真正想要做的是 invoke 方法 - 为此,在 C# 中,您必须提供参数列表(在这种情况下为空),因此:Read()

【讨论】:

    【解决方案2】:
    if (rdr.Read())
    {
        strReturn = rdr["ID"].ToString();
    }
    

    【讨论】:

    • Read是SqlDataReader类中的一个方法,在这种情况下不带参数
    • @Jhonny 在 C# 中,方法调用总是需要 圆括号,即使它们不带 参数
    • 谢谢你的帮助,现在我明白了,这完全有道理
    • 是的,但他明确表示这段代码sn-p是从VB翻译过来的。我认为扩展一点解释是个好主意,而不仅仅是指出错误,因为编译器已经这样做了
    【解决方案3】:

    用于无参数方法的方法调用的 () 在 C# 中不是可选的。如果没有括号,则表达式标识方法(组)而不是其结果值。这种行为使语法的歧义性大大降低,尤其是对于返回委托的方法。

    当 C# 程序员看到“无法将方法组 '...' 转换为非委托类型 '...'”时的第一反应通常是“哦,我忘了我的 () 用于调用”。

    【讨论】:

      【解决方案4】:

      看到您的源代码,我强烈建议对 SqlConnection 和 SqlDataReader 使用 using 语句。

      如果您不关闭阅读器,垃圾收集时刻将决定阅读器何时完成。当您不知道时,您可以关闭 SqlServer。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        相关资源
        最近更新 更多