箭头是问题的开始。当返回对象并拉出站点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()
在字符串上迭代单个字符。您还会期待什么?
我不确定您想在这里执行什么代码,所以我必须提出几个不同的建议:
- 完全摆脱
foreach
。将开关保持在循环主体中。您已经用while (dr.Read())
的行迭代。 - 将
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
之前