我试图“收集” GetString(2)直到GetString(0)发生变化,所以试图找出如何从创建和添加新的“ lookaheadRunInfo”实例中分离出“收集”?引发异常
System.NullReferenceException was unhandled by user code
lookaheadRunInfo.gerrits.Add(rdr.GetString(1));,谁能提供有关解决此问题的指南?

       try
        {
            Console.WriteLine("Connecting to MySQL...");
            conn.Open();

            string sql = @"select lr.ec_job_link, cl.change_list ,lr.submitted_by, lr.submission_time,lr.lookahead_run_status
                                from lookahead_run as lr, lookahead_run_change_list as lrcl, change_list_details as cld,change_lists as cl
                                where lr.lookahead_run_status is null
                                and lr.submission_time is not null
                                and lrcl.lookahead_run_id = lr.lookahead_run_id
                                and cl.change_list_id = lrcl.change_list_id
                                and cl.change_list_id not in (select clcl.change_list_id from component_labels_change_lists as clcl)
                                and cld.change_list_id = lrcl.change_list_id
                                group by lr.lookahead_run_id, cl.change_list
                                order by lr.submission_time desc
                                limit 1000
                                ";

            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();
            var ECJoblink_previous ="";
            var gerritList = new List<String>();

            while (rdr.Read())
            {
                //Console.WriteLine(rdr[0] + " -- " + rdr[1]);
                //Console.ReadLine();
                var lookaheadRunInfo = new LookaheadRunInfo();
                lookaheadRunInfo.ECJobLink = rdr.GetString(0);
                if (ECJoblink_previous == lookaheadRunInfo.ECJobLink)
                {
                    //Keep appending the list of gerrits until we get a new lookaheadRunInfo.ECJobLink
                    lookaheadRunInfo.gerrits.Add(rdr.GetString(1));
                }
                else
                {
                    lookaheadRunInfo.gerrits = new List<string> { rdr.GetString(1) };
                }
                ECJoblink_previous = lookaheadRunInfo.ECJobLink;
                lookaheadRunInfo.UserSubmitted = rdr.GetString(2);
                lookaheadRunInfo.SubmittedTime = rdr.GetString(3).ToString();
                lookaheadRunInfo.RunStatus = "null";
                lookaheadRunInfo.ElapsedTime = (DateTime.UtcNow-rdr.GetDateTime(3)).ToString();
                lookaheadRunsInfo.Add(lookaheadRunInfo);
            }

            rdr.Close();
        }
        catch
        {
            throw;
        }

最佳答案

如果我正确理解您的要求,则希望对结果集的多行保留一个lookaheadRunInfo,直到GetString(0)更改为止。那正确吗?

在这种情况下,您将遇到一些重大的逻辑问题。即使我们修复了空引用,它的编写方式也会在每一行中都有一个新的lookaheadRunInfo

尝试这个:

string ECJoblink_previous = null;
LookAheadRunInfo lookaheadRunInfo = null;
while (rdr.Read())
{
    if (ECJoblink_previous != rdr.GetString(0))  //A new set of rows is starting
    {
        if (lookaheadRunInfo != null)
        {
            lookaheadRunsInfo.Add(lookaheadRunInfo); //Save the old group, if it exists
        }
        lookaheadRunInfo = new LookAheadRunInfo     //Start a new group and initialize it
        {
            ECJobLink = rdr.GetString(0),
            gerrits = new List<string>(),
            UserSubmitted = rdr.GetString(2),
            SubmittedTime = rdr.GetString(3).ToString(),
            RunStatus = "null",
            ElapsedTime = (DateTime.UtcNow-rdr.GetDateTime(3)).ToString()
        }
    }
    lookahead.gerrits.Add(rdr.GetString(1));   //Add current row
    ECJoblink_previous = rdr.GetString(0);     //Keep track of column 0 for next iteration
}
if (lookaheadRunInfo != null)
{
    lookaheadRunsInfo.Add(lookaheadRunInfo); //Save the last group, if there is one
}


这里的想法是:


从空白开始,未初始化
监视列0。更改时(如第一行所示),保存所有旧列表并开始一个新列表
每次迭代都添加到当前列表
完成后,将所有剩余的项目保存在自己的列表中。如果读取器返回0行,则需要进行空检查。

10-04 10:26