C# 为什么第二次函数迭代只添加[MemNo],没有其他数据?

C# 为什么第二次函数迭代只添加[MemNo],没有其他数据?,c#,.net,winforms,listview,listviewitem,C#,.net,Winforms,Listview,Listviewitem,因此,按照我的编码方式,用户在通过我的Winforms应用程序进行查询时可以选择3个数据源:SOURCE1和SOURCE2。对于SOURCE1或SOURCE2,我的代码可以正常工作,查询400系统中的数据并通过datareader循环以将数据放置在ListView控件中 当用户选择两者作为数据源时,我的查询字符串将变为“从X中选择…从Y中选择” 我猜400个系统查询与SQL Server系统不同,它不允许您通过使用分号(;)分隔查询来尝试在一次点击中执行多个选择。因此,为了解决这个问题,当查询字

因此,按照我的编码方式,用户在通过我的Winforms应用程序进行查询时可以选择3个数据源:SOURCE1和SOURCE2。对于SOURCE1或SOURCE2,我的代码可以正常工作,查询400系统中的数据并通过datareader循环以将数据放置在ListView控件中

当用户选择两者作为数据源时,我的查询字符串将变为“从X中选择…从Y中选择”

我猜400个系统查询与SQL Server系统不同,它不允许您通过使用分号(;)分隔查询来尝试在一次点击中执行多个选择。因此,为了解决这个问题,当查询字符串包含分号(;)时,我将调用GetISeriesData()函数两次。我的代码处理第一个查询,然后重复并使用第二个查询

我得到的是一些非常奇怪的行为,没有错误:

SOURCE1查询功能完美,检索所有可用数据并按预期填充ListView控件。但是,使用SOURCE2的代码的第二次迭代只填充ListView的[MemNo]字段

我已经验证了其他数据是否已成功返回,通过单步执行,代码方面的值应该被插入到控件中。有人能发现我可能忽略的东西吗?就我个人而言,我无法理解为什么会发生这种情况

代码

private void btnSearch_Click(object sender, EventArgs e)
        {
            lvData.Clear();
            string qryCmd = "";

            createColumns();

            switch (cmbLetterType.SelectedIndex)
            {
                case 0:
                    qryCmd = chkSystem("oldAddr");
                    break;
                case 1:
                    qryCmd = chkSystem("newAddr");
                    break;
                case 2:
                    qryCmd = chkSystem("nameChg");
                    break;
            }

            // If the option for BOTH is selected, qryCmd is a long string containing the individual queries for SOURCE1 and SOURCE2.
            // Here I check if a semicolon (;) exists, denoting that there are 2 cmd queries in the string.
            // If so, I split the query calling GetiSeriesData() with the first query string, then assigning qryCmd the second 
            // strings value and continuing processing as normal.
            if (qryCmd.Contains(";"))
            {
                char[] delimitChar = { ';' };
                string[] splitQueries = qryCmd.Split(delimitChar);
                qryCmd = splitQueries[0];
                GetiSeriesData(qryCmd);
                qryCmd = splitQueries[1];
            }

            GetiSeriesData(qryCmd);

            // Display message if no records found.
            if (lvData.Items.Count == 0)
            {
                MessageBox.Show("No records found.");
            }
            lblRecCnt.Text = lvData.Items.Count.ToString();
            this.lvData.CheckBoxes = true;
        }

编辑:


解决了
x
在第二次迭代时被重置为0,导致所有子项数据与其项不匹配,并且没有任何内容写入字段。将
x
设置为一个更高的范围值,现在一切都处理得很好,所有数据都存在。

多个查询意味着您可能在选择中有不同的字段,您应该考虑到这一点。顺便说一句,我想介绍一下
OdbcDataReader.NextResult()
的用法,它允许您在分号分隔的查询(批处理查询)中循环遍历所有结果。通过这种方式,您可以使
do while
循环,而
NextResult()
返回true,在这种情况下,您有另一个while循环,而
Read()
返回true。很有趣,感谢您对术语规范的了解。关于我的非书面数据问题有什么想法吗?我不确定,但正如我所说的,您有多个查询,因此每个查询的SELECT中可能有不同的字段,如果所有查询看起来都像
SELECT A、B、C…
,那么我不认为第一个查询运行OK(填充所有
A、B、C
)第二个只填充1个字段(只填充
A
)。查询运行得很好,但填充ListView控件不好。我发现在第二次迭代中我重置了
x=0
,导致没有子项数据被添加。现在一切都好了,谢谢。
        public void GetiSeriesData(string query)
        {
            OdbcDataReader dr;
            try
            {
                //Set value of system based on table being looked at in ConnectionString
                string sysValue = "";
                if (query.Contains("lib1"))
                {
                    sysValue = "P";
                }
                if (query.Contains("lib2"))
                {
                    sysValue = "N";
                }

                MergeDocLibrary mdl = new MergeDocLibrary();
                dr = mdl.GetData(query);

                Int16 x = 0;
                string gndr = "";

                // Fill ListView Control lvData
                while (dr.Read())
                {
                    lvData.Items.Add(dr["MEMNO"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["NAME"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["ADDR1"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["ADDR2"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["STATE"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["ZIP"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["OLD_ADDR1"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["OLD_ADDR2"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["OLD_CITY"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["OLD_STATE"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["OLD_ZIP"].ToString().Trim());

                    lvData.Items[x].SubItems.Add(sysValue.ToString().Trim());
                    lvData.Items[x].SubItems.Add(DateTime.Today.ToString("d"));
                    lvData.Items[x].SubItems.Add(dr["SEX"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["LNAME"].ToString().Trim());
                    if (dr["SEX"].ToString().Trim() == "M")
                    {
                        gndr = "Mr.";
                    }
                    else // (dr["SEX"].ToString().Trim() == "F)
                    {
                        gndr = "Ms.";
                    }
                    lvData.Items[x].SubItems.Add(gndr + dr["LNAME"].ToString().Trim());
                    lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim() + ", " + dr["STATE"].ToString().Trim() + " " + dr["ZIP"].ToString().Trim());
                    x += 1;
                }

                mdl.closeConn();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
            }
            finally
            {

            }
        }