如何从SqlDataReader获取数据到数组Array或字符串数​​组

时间:2013-08-08 10:49:35

标签: c# sql-server arrays

我正在尝试从SqlDataReader填充数组数组,但最后数组的所有行都填充了相同的数字数组。

这是我的T-SQL代码:

SELECT 
    SUM(memberAttendants),
    Groups.Name,
    DATEPART(wk,convert(datetime,convert(varchar,StatisticsDate),104))
FROM 
    Stat.dbo.GroupStatistics 
INNER JOIN 
    Stat.dbo.Groups ON GroupStatistics.GroupID = Groups.GroupID 
WHERE 
    (Groups.OrganizationID = '4960') 
GROUP BY 
    Groups.Name, convert(datetime, convert(varchar, StatisticsDate), 104)
ORDER BY 
    Groups.Name, convert(datetime, convert(varchar, StatisticsDate), 104)

C#代码:

SqlDataReader myReader1 = cmd1.ExecuteReader();

if (myReader1.HasRows)
{
    int i = 0, j = 0;
    string[] Name;
    Name = new string[100];
    int[][] MainArray = new int[100][];

    int[] ActivityArray;
    ActivityArray = new int[52];
    int[] WeekOfActivity;
    WeekOfActivity = new int[52];
    bool myFlag = false;

    for (int myCounter = 0; myCounter <= myReader1.FieldCount; myCounter++)
    {
        Aktivitet[myCounter] = new int[myCounter];
    }

    while (myReader1.Read())
    {
      if (!myReader1.IsDBNull(0) && !myReader1.IsDBNull(1))
      {
        if (i == 0 || myReader1.GetString(1) == Name[i-1]  || myFlag == true)
        {
           if (myFlag == true && myReader1.GetString(1) != Name[i-1])
           {
              i = 0;
              MainArray[j] = ActivityArray;
           }
           myFlag = false;
           ActivityArray[i] = myReader1.GetInt32(0);
           Name[i] = myReader1.GetString(1);
           i++;
       }
       else
       {
           MainArray[j] = ActivityArray;
           j++;
           i = 0;
           Name[i] = myReader1.GetString(1);
           ActivityArray[i] = myReader1.GetInt32(0);
           i++;
           myFlag = true;
       }
   }
}

MainArray[j] = ActivityArray;

如果没有最后一个ActivityArray覆盖MainArray中的所有行,我如何填充MainArray?

TNX

1 个答案:

答案 0 :(得分:0)

这里缺少的是数组是引用类型。所以当你说:

MainArray[j] = ActivityArray

您正在将MainArray中的条目设置为指向ActivityArray。你永远不会创建一个新的ActivityArray,所以他们都指向同一个地方。

因为你覆盖了ActivityArray的内容,所以你实际上覆盖了MainArray中的所有条目(因为它们都是相同的条目)。

所以,你可能想要

while (myReader1.Read())
{
    ActivityArray = new int[52];
    if (!myReader1.IsDBNull(0) && !myReader1.IsDBNull(1))
    {

我放弃的原因可能是因为我的代码试图做的事情并不是那么清楚。