C#Foreach(var)语句只返回单个字符而不是整个字符串

时间:2017-04-20 00:59:48

标签: c# foreach

箭头是问题的开始。当返回对象并拉出站点ID时,它会一直运行到案例10.一旦它命中它,它只会拉动" 1"然后从行返回并拉出" 0"。如果我只指向直接对象 rows [0] [4.ToString()] rows [i] [4] .ToString()将拉出整个字符串,但是当我用 中的项目运行它时,它只会拉出单个字符。我已尝试过列中的实际单词,并且逐字逐句。

我不确定是否遗漏了一些我不知道的东西,或者这对于开关盒是不可能的,或者我是怎么做的。

这是我的第一个真正的项目,所以请原谅一堆乱码。感谢您提前获得任何见解!

        {
            string connectionString =
                "User=***;" +
                "Password=***;" +
                "Database=server:D:Site.FDB;";

            FbConnection myConnection = new FbConnection(connectionString);

            try
            {
                myConnection.Open();

                String sql = "Select f_StatusCode(s.status) status,  count(si.qty) total, s.logdate, i.reportcategory, s.site locationid, sa.sitename " +
                "From " +
                "V_item i " +
                "Inner join v_SaleItems si on " +
                "i.objid = si.item " +
                "inner join v_sale s on " +
                "s.objid = si.saleid " +
                "Inner join v_Site sa on " +
                "sa.id = s.site " +
                "where i.objid in ('606297', '606552', '606590', '49501440', '49501448', '49501680', '609015', '609014') and f_StatusCode(s.status) in ('C:PW') and s.site = si.site and " +
                "s.terminal <> 3500036 and " +
                "i.reportcategory in ('500027') and s.logdate = 'TODAY' GROUP BY locationid, i.reportcategory,  s.logdate, i.itemtype, s.status, sa.sitename";
                FbCommand com = new FbCommand(sql, myConnection);
                FbDataReader dr = com.ExecuteReader();
                {

                        {
                            var currentTotal = 0;
                            var rows = new List<object[]>();
                            i = 0;
                           **while (dr.Read())
                            {
                                var columns = new object[dr.FieldCount];
                                dr.GetValues(columns);
                                rows.Add(columns);
             ===>           foreach (var item in (rows[i][4].ToString()))**
                            { 
                                    switch (item.ToString())
                                    {
                                        case "2":
                                            northCountLbl.Text = rows[i][1].ToString();
                                            currentTotal += Int32.Parse(northCountLbl.Text);
                                            currentCountLbl.Text = currentTotal.ToString();
                                            i++;
                                            break;

                                        case "3":
                                            ceresCountLbl.Text = rows[i][1].ToString();
                                            currentTotal += Int32.Parse(ceresCountLbl.Text);
                                            currentCountLbl.Text = currentTotal.ToString();
                                            i++;
                                            break;

                                        case "10":
                                            riverbankCountLbl.Text = rows[i][1].ToString();
                                            currentTotal += Int32.Parse(riverbankCountLbl.Text);
                                            currentCountLbl.Text = currentTotal.ToString();
                                            i++;
                                            break;
                                        case "11":
                                            atwaterCountLbl.Text = rows[i][1].ToString();
                                            currentTotal += Int32.Parse(atwaterCountLbl.Text);
                                            currentCountLbl.Text = currentTotal.ToString();
                                            i++;
                                            break;

                                    }
                                }
                            }
                        }
                    }                           
                }
                dr.Close();
                myConnection.Close();
                Console.ReadLine();
            }
            catch (Exception er)
            {
                Console.WriteLine(er.Message);
            }
        }

2 个答案:

答案 0 :(得分:2)

仔细查看此代码:

foreach (var item in (rows[i][4].ToString()))

具体来说,这个表达式:

rows[i][4].ToString()

查找当前行中的第5个(0索引)列,并将该值转换为字符串。然后,对该字符串值使用foreach当然 foreach()在字符串上迭代单个字符。您还期待什么?

我不确定您希望代码在这里做什么,所以我不得不提出几个不同的建议:

  1. 彻底摆脱foreach。将开关保持在环体中。您已经使用while (dr.Read())迭代行。
  2. foreach更改为:foreach (var item in rows[i].Select(c => c.ToString()))。这将循环遍历结果集中的每个列。

答案 1 :(得分:1)

其他已经为您提供了问题的答案:您循环一个字符串,实际上是一个字符数组,您将获得该数组中的每个项目。

所以,正如其他人所说,item = row[i][4].ToString();将是达到你想要的最佳方法。

现在,在代码的其他部分:

  • 您的string sql变量是从一系列字符串连接操作中分配的,这些操作非常糟糕(内存方面)。也许你可以使用Verbatim multiline string literalString.ConcatStringBuilder object
  • 将连接对象放在using语句
  • FbDataReader dr = com.ExecuteReader();声明
  • 内的using相同
  • 使用using语句,您不需要Close();
  • 如果您不喜欢using语句的想法,请至少在最终Close();
  • 之前将finally置于catch块中