0

查询执行后,我需要获取的结果是 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"]);
4

4 回答 4

6

采用

   String UserNames = reader.GetString(0); 

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

  String UserNames = reader["users"].ToString(); 
于 2012-06-11T10:38:00.530 回答
4

很确定你只是想做:

String UserNames = reader["users"] as string;
于 2012-06-11T10:38:01.403 回答
4

您的错误是编译器错误,因为您试图将索引语法应用于方法调用,在 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. 没有对序数进行硬编码,因此如果有人要更改存储过程/脚本中结果集中的列位置,我的代码将继续工作。
于 2012-06-11T10:41:35.923 回答
3
String UserNames;
if(reader["users"]!=null)     
UserNames = (string)reader["users"];//or reader["users"].ToString();
于 2012-06-11T10:41:14.940 回答