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



箭头是问题的开始。当返回对象并拉出站点ID时,它会一直延伸到情况10。一旦撞击它,它只会从行中拉出" 1",然后回到四处拉动" 0"。如果我只指向直接对象 rows [0] [4.ToString((],但是当我在中使用 var item进行跑步时,它只会拉出单个字符。我已经尝试了列中的实际单词,并通过字母进行字母。

我不确定是否有很小的东西我缺少,或者是否无法使用开关情况,或者我的操作方式。

这是我的第一个真正的项目,请原谅代码混乱。感谢提前的任何见解!

        {
            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);
            }
        }

仔细查看此代码:

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()))。这将遍历结果集中的每个列。

其他已经给了您问题的答案:您在循环一根字符串,实际上是一系列字符,您在该数组中获取每个项目。

因此,正如其他人建议的那样,item = row[i][4].ToString();将是实现您想要的最佳方法。

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

  • 您的string sql变量是从非常糟糕的一系列字符串串联操作中分配的(内存(。也许您可以使用Verbatim Multiline字符串字符串,字符串。或StringBuilder对象
  • 将连接对象放入using语句的内部
  • using语句内部的FbDataReader dr = com.ExecuteReader();相同
  • 使用using语句,您不需要Close();
  • 如果您不喜欢using语句的想法,则至少将Close();放在finally块中,然后在最终的catch
  • 之前

最新更新