C# 在使用SqlDataReader之前,如何知道或获取数组大小?并将其作为json返回

C# 在使用SqlDataReader之前,如何知道或获取数组大小?并将其作为json返回,c#,asp.net,sql-server,datareader,C#,Asp.net,Sql Server,Datareader,我想知道数组的大小,以循环所需的时间,但我不知道如何以有效的方式进行循环,我唯一能想到的方法是将数组放入读取器并计数,然后使用另一个时间读取器并插入值:(我是一名学生 这是密码 myConnection.Open(); SqlCommand sqlCommand = new SqlCommand(" SELECT * FROM table ", myConnection); SqlDataReader dr = sqlCommand.ExecuteReader(); Calendar[] l

我想知道数组的大小,以循环所需的时间,但我不知道如何以有效的方式进行循环,我唯一能想到的方法是将数组放入读取器并计数,然后使用另一个时间读取器并插入值:(我是一名学生

这是密码

myConnection.Open();
SqlCommand sqlCommand = new SqlCommand(" SELECT * FROM table ", myConnection);

SqlDataReader dr = sqlCommand.ExecuteReader();

Calendar[] loArrayRegistrosCalendario = new Calendar[200]; //200 As an example

if (dr != null)
{
    int i = 0;

    while (dr.Read())
    {
        Calendar loRegistroDia = new Calendar();
        loRegistroDia.User = (dr["user"].ToString());

        loArrayRegistrosCalendario[i] = loRegistroDia;
        i = i + 1;
    }
}

return loArrayRegistrosCalendario;

只需创建一个SQL命令即可获得如下计数:

SqlCommand sqlCommand = new SqlCommand(" SELECT Count (*) FROM table ", myConnection);

int rows = sqlCommand.ExecuteScalar();

Calendar[] loArrayRegistrosCalendario = new Calendar[rows];

您根本不需要数组

myConnection.Open();

var loArrayRegistrosCalendario = new List<Calendar>();

using (SqlCommand sqlCommand = new SqlCommand(" SELECT * FROM table ", 
  myConnection);)
{

  using (SqlDataReader dr = sqlCommand.ExecuteReader())
  {

    if (dr != null)
    {
      while (dr.Read())
      {
        Calendar loRegistroDia = new Calendar();
        loRegistroDia.User = (dr["user"].ToString());

        loArrayRegistrosCalendario.Add(loRegistroDia);
      }
    }
  }
}

return loArrayRegistrosCalendario;
结果:

[{“姓名”:“一月”},{“姓名”:“二月”},{“姓名”:“三月”},{“姓名”:“四月”},{“姓名”:“五月”},{“姓名”:“七月”},{“姓名”:“八月”},{“姓名”:“九月”},{“姓名”:“十月”},{“姓名”:“十一月”},{“姓名”:“十二月”},{“姓名”:“一月”}]

[{“姓名”:“一月”},{“姓名”:“二月”},{“姓名”:“三月”},{“姓名”:“四月”},{“姓名”:“五月”},{“姓名”:“七月”},{“姓名”:“八月”},{“姓名”:“九月”},{“姓名”:“十月”},{“姓名”:“十一月”},{“姓名”:“十二月”},{“姓名”:“一月”}]


为什么不使用支持动态项目数的类(如
List()
),那么如果必须使用数组,可以调用
.ToArray()
?我已经用list做过了,但我需要一个json对象,这就是为什么我要创建一个类:CYou可以像数组一样轻松地将列表序列化为json数组。真的吗?D:我已经调查了3个小时,知道我需要创建一个类,并按照我必须序列化的方式进行操作:s。请注意,你的问题是个糟糕的问题,因为它是pr在最近的一次编辑之前,安。我对这里的下行投票感到困惑。如果他创建的数组大小与数据集的大小相同,那么它肯定只会循环找到正确的项数……或者我在这里遗漏了什么?可能是因为这会增加对DB的另一个调用。另外,如果在获取计数和selectin之间从表中添加或删除行,会怎么样g行?我部分同意你的第一点,尽管我认为在这个例子中,开销是最小的。但是,添加/删除行我看不出是一个问题,除非它发生在打开读卡器和获取计数之间的瞬间。根据我的经验,事情发生在这一瞬间的频率比一个人可能发生的要高想一想。赛况可能很难追踪,最好尽可能避免造成赛况的可能性。
List
a数组列表?这是你真正想要的吗?@AaronLS肯定是!:)谢谢。@Erik Philips真棒、高效、完整且漂亮的答案!非常感谢:)
public class Program
{
    public static void Main()
    {
        var myobject = new MyObject();
        myobject.Calendars1 = new List<Calendar>();
        for (DateTime dt = new DateTime(1980,1,1); dt <= new DateTime(1981,1,1); dt = dt.AddMonths(1))
        {
            myobject.Calendars1.Add(new Calendar() { Name =  dt.ToString("MMMM") });
        }
        
        myobject.Calendars2 = myobject.Calendars1.ToArray();
        
        var json1 = JsonConvert.SerializeObject(myobject.Calendars1);
        var json2 = JsonConvert.SerializeObject(myobject.Calendars2);
        
        Console.WriteLine(json1);
        Console.WriteLine(json2);
    }
}

public class MyObject
{
    public List<Calendar> Calendars1 { get; set; }
    public Calendar[] Calendars2 { get; set; }
}

public class Calendar
{
    public string Name { get; set; }
}