Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将带[]的索引应用于类型为';方法组';_C#_C# 4.0 - Fatal编程技术网

C# 无法将带[]的索引应用于类型为';方法组';

C# 无法将带[]的索引应用于类型为';方法组';,c#,c#-4.0,C#,C# 4.0,在查询执行之后,我需要获取的结果是用户名部分 我收到一个错误:无法将[]索引应用于“方法组”类型的表达式 public class ProcessInput { string connectionString = (string)ConfigurationSettings.AppSettings["myConString"]; private string msg_arr; string username = null; private void MooseSe

在查询执行之后,我需要获取的结果是用户名部分

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

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"]);
使用

正如@leppie在其评论中指出的,您也可以将字段名用作索引器
因此,假设字段名为
users
,您也可以这样写:

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

很确定你只想做:

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

当您试图将索引语法应用于方法调用时,您的错误是一个编译器错误,在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);
    }
}
注意,在迭代未知数量的记录之前,我向读者询问序号。这有两个原因:

  • 我缓存了序号一次,并多次使用它,这有助于提高性能
  • 我没有对序号进行硬编码,因此如果有人在存储过程/脚本的结果集中更改列位置,我的代码将继续工作

  • 它确实提供了它。查看索引器。@Steve有几点,调用
    ToString
    可能会遇到空值或非字符串的内容,硬编码序数通常不是一个好主意。@Adamhuldsworth我同意,但我有一个疑问。我们可以插入一个
    !reader.IsDBNull(ordinalPos)
    ,但如果该字段包含DBNull.Value,则ToString()将转换为string.Empty,我不知道这是否是用户需要的。当我在用户后面加上点时,没有tostring@CoDeaDDict
    ToString
    (string)val
    不等效。当接收到一个值时,
    ToString
    将为您提供一个字符串,即使SQL中的数据类型已更改。这可能是个问题。我倾向于从预期的数据类型强制转换,因此如果它们发生更改,代码将失败,更改将变得可见。+1用于获取序号,而不是硬编码。我认为这一点会从你的生活中受益answer@DaveBish我的一个抱怨是,如果列不是字符串,这将产生一个无提示的null(因为
    as
    不会导致无效的强制转换异常)。我想你需要问如果它是null,或者不是字符串,它应该返回什么。我认为这是非常具体的实现。
    string username = (string)reader["users"];
    
    using (SqlDataReader reader = com.ExecuteReader())
    {
        int userOrd = reader.GetOrdinal("users");
    
        while (reader.Read())
        {
            string username = reader.GetString(userOrd);
        }
    }