箭头是问题的开始。当返回对象并拉出站点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);
}
}
答案 0 :(得分:2)
仔细查看此代码:
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()))
。这将循环遍历结果集中的每个列。答案 1 :(得分:1)
其他已经为您提供了问题的答案:您循环一个字符串,实际上是一个字符数组,您将获得该数组中的每个项目。
所以,正如其他人所说,item = row[i][4].ToString();
将是达到你想要的最佳方法。
现在,在代码的其他部分:
string sql
变量是从一系列字符串连接操作中分配的,这些操作非常糟糕(内存方面)。也许你可以使用Verbatim multiline string literal,String.Concat
或StringBuilder object using
语句FbDataReader dr = com.ExecuteReader();
声明using
相同
using
语句,您不需要Close();
using
语句的想法,请至少在最终Close();
finally
置于catch
块中