【问题标题】:Cannot apply indexing with [] to an expression of type 'method group'无法使用 [] 将索引应用于“方法组”类型的表达式
【发布时间】:2012-06-11 19:18:18
【问题描述】:

查询执行后,我需要获取的结果是 UserNames 部分。

我收到一个错误:无法使用 [] 将索引应用于“方法组”类型的表达式

public class ProcessInput
{
    string connectionString = (string)ConfigurationSettings.AppSettings["myConString"];
    private string msg_arr;
    string username = null;

    private void MooseSeenInput(string MobileNo, string Date, string odd, params Array[] msg_arr)
    {
        SqlConnection conn = new SqlConnection(myConString);
        conn.Open();
        SqlCommand com = new SqlCommand("SELECT * FROM Users as users WHERE UserName=@UserName AND State!='1' AND State!='4'", conn);
        com.Parameters.AddWithValue("@UserName", UserName);
        // com.ExecuteNonQuery();
        using (SqlDataReader reader = com.ExecuteReader())
        {
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    String UserNames = (reader.Read["users"]);
                }
            }
        }
    }
}

错误发生在以下行:

String UserNames = (reader.Read["users"]);

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    使用

       String UserNames = reader.GetString(0); 
    

    正如@leppie 在其评论中指出的那样,您还可以使用字段名称作为索引器
    所以假设这个字段被命名为users,你也可以这样写:

      String UserNames = reader["users"].ToString(); 
    

    【讨论】:

    • 它确实提供了它。请参阅索引器。
    • @Steve 有几点,调用ToString 可能会遇到空值或不是字符串的东西,并且硬编码序数通常不是一个好主意。
    • @AdamHouldsworth 我同意,但我对此有疑问。我们可以插入一个!reader.IsDBNull(ordinalPos),但如果该字段包含 DBNull.Value,那么 ToString() 将转换为 string.Empty,我不知道这是否是用户需要的。
    【解决方案2】:

    您的错误是编译器错误,因为您试图将索引语法应用于方法调用,在 C# 中涉及括号。

    SqlDataReader 确实公开了一个索引器,但它位于阅读器本身,而不是方法成员:

    string username = (string)reader["users"];
    

    这就是我倾向于为这段代码设置样式的方式:

    using (SqlDataReader reader = com.ExecuteReader())
    {
        int userOrd = reader.GetOrdinal("users");
    
        while (reader.Read())
        {
            string username = reader.GetString(userOrd);
        }
    }
    

    请注意,在迭代未知数量的记录之前,我会向读者询问序数。这有两个好处:

    1. 我将序号缓存了一次并多次使用,这有助于提高性能。
    2. 我已没有硬编码序数,因此如果有人要更改存储过程/脚本中结果集中的列位置,我的代码将继续上班。

    【讨论】:

    • +1 用于获取序数而不是硬编码。我认为这一点会受益于你的回答强调
    【解决方案3】:

    很确定你只是想做:

    String UserNames = reader["users"] as string;
    

    【讨论】:

    • @DaveBish 我的一个抱怨是,如果该列碰巧不是一个字符串,这将产生一个静默空值(因为as 不会导致无效的强制转换异常)。
    • 我猜你需要问“它应该返回什么”如果它是空的,或者不是一个字符串。我认为这是非常具体的实现。
    【解决方案4】:
    String UserNames;
    if(reader["users"]!=null)     
    UserNames = (string)reader["users"];//or reader["users"].ToString();
    

    【讨论】:

    • 当我把 DOT 放在用户之后没有 tostring
    • @CoDeaDDict ToString(string)val 不等效。当接收到一个值时,ToString 会给你一个字符串,即使 SQL 中的数据类型已经改变。这可能是个问题。我倾向于从预期的数据类型进行转换,所以如果它们发生变化,代码就会失败并且变化会变得可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2018-04-03
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多