我正在尝试从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
答案 0 :(得分:0)
这里缺少的是数组是引用类型。所以当你说:
MainArray[j] = ActivityArray
您正在将MainArray中的条目设置为指向ActivityArray。你永远不会创建一个新的ActivityArray,所以他们都指向同一个地方。
因为你覆盖了ActivityArray的内容,所以你实际上覆盖了MainArray中的所有条目(因为它们都是相同的条目)。
所以,你可能想要
while (myReader1.Read())
{
ActivityArray = new int[52];
if (!myReader1.IsDBNull(0) && !myReader1.IsDBNull(1))
{
我放弃的原因可能是因为我的代码试图做的事情并不是那么清楚。