尝试返回'选择计数(Id)'时的System.IndexOutOfRangeException

时间:2015-05-18 23:03:39

标签: c# asp.net sql-server

我试着看一下,但没有其他问题真的适合。我有一个网页,我将展示分析。一个stat是用户总数,我试图在sql数据库中获取用户表中的总行数。我以为Id会是一个int,但看起来它是varchar(128)。我将包含错误和代码。谢谢!!

  

类型' System.IndexOutOfRangeException'的例外情况发生在System.Data.dll中但未在用户代码中处理

public static string GetUserSum(string rConnStr)
    {
        string UserCount = "";

        using (SqlConnection conn = new SqlConnection(rConnStr))
        {
            const string sqlText = @"
SELECT COUNT(Id)
FROM AspNetUsers
             ";

            using (SqlCommand cmd = new SqlCommand(sqlText, conn))
            {

                conn.Open();

                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    bool result = sdr.Read();
                    if (result)
                    {

                        UserCount = DBUtils.GetValue<string>(sdr["Id"]); //it breaks right here

                    }
                }
            }
        }

        return UserCount;
    }

3 个答案:

答案 0 :(得分:3)

我认为问题在于您从SQL获得的内容中的列名称并不是您所期望的。我相信您的代码的以下更改将解决该问题。

const string sqlText = @"
SELECT COUNT(Id) AS Id
FROM AspNetUsers
             ";

答案 1 :(得分:1)

您的错误来自这一行:

 UserCount = DBUtils.GetValue<string>(sdr["Id"]);

因为您的查询中未返回ID为“Id”的字段。

最简单的解决方法是:

UserCount = DBUtils.GetValue<string>(sdr[0]).Tostring();

答案 2 :(得分:0)

IndexOutOfRangeException指示没有返回到SqlDataReader的“Id”列。

解决问题的第一步可能是发现实际返回的列。以下是如何执行此操作的示例: Check for column name in a SqlDataReader object