我正在尝试总计我的产品的每月销售总额(Limonade
)。我在循环外的代码遇到问题。我的所有12个数组字符串都具有相同的值,即最后一个数组字符串(monthLimonade[11]
)的值。
我的数据库查询准确地将月销售额总计为(monthlyLimonade
)。我验证了我的数组在循环内部工作。
我哪里错了?
String[] monthLimonade = new String[12];
try
{
//CONNECTION STRING INFO...
cnn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Label lblmonthLimonade = new Label();
for (int i = 0; i < 12; i++)
{
monthLimonade[i] = reader.GetString("monthlyLimonade");
lblmonthLimonade.Text = monthLimonade[i];
}
//This label inside the reader loop gives correct output
flowLayoutPanel1.Controls.Add(lblmonthLimonade);
}
cnn.Close();
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, "MySql, no connection!");
}
int m1l = Int32.Parse(monthLimonade[0]);
int m2l = Int32.Parse(monthLimonade[1]);
int m3l = Int32.Parse(monthLimonade[2]);
int m4l = Int32.Parse(monthLimonade[3]);
int m5l = Int32.Parse(monthLimonade[4]);
int m6l = Int32.Parse(monthLimonade[5]);
int m7l = Int32.Parse(monthLimonade[6]);
int m8l = Int32.Parse(monthLimonade[7]);
int m9l = Int32.Parse(monthLimonade[8]);
int m10l = Int32.Parse(monthLimonade[9]);
int m11l = Int32.Parse(monthLimonade[10]);
int m12l = Int32.Parse(monthLimonade[11]);
// Here in my chart I get all the same values for every month "10516"
this.chart1.Series["Limonade"].Points.AddXY("January", m1l);
this.chart1.Series["Limonade"].Points.AddXY("February", m2l);
this.chart1.Series["Limonade"].Points.AddXY("March", m3l);
this.chart1.Series["Limonade"].Points.AddXY("April", m4l);
this.chart1.Series["Limonade"].Points.AddXY("May", m5l);
this.chart1.Series["Limonade"].Points.AddXY("June", m6l);
this.chart1.Series["Limonade"].Points.AddXY("July", m7l);
this.chart1.Series["Limonade"].Points.AddXY("August", m8l);
this.chart1.Series["Limonade"].Points.AddXY("September", m9l);
this.chart1.Series["Limonade"].Points.AddXY("October", m10l);
this.chart1.Series["Limonade"].Points.AddXY("November", m11l);
this.chart1.Series["Limonade"].Points.AddXY("December", m12l);
flowLayoutPanel1.Controls.Add(chart1);
答案 0 :(得分:1)
修改强>
原始答案是基于原始问题而且可以用来解决编辑问题的问题,但编辑问题的问题仍然存在,我试着更清楚地描述它:
在第01行中,reader.Read()
读取结果集的每一行,并在第06行的循环语句中将数组的每个元素设置为当前行的monthlyLimonade
列的相同值,因此由于reader.Read()
,这将重复下一行,最后,数组的所有元素都将包含结果集中最后一行的monthlyLimonade
值。
01: while (reader.Read())
02: {
03: Label lblmonthLimonade = new Label();
04: for (int i = 0; i < 12; i++)
05: {
06: monthLimonade[i] = reader.GetString("monthlyLimonade");
07: lblmonthLimonade.Text = monthLimonade[i];
08: }
09: //This label inside the reader loop gives correct output
10: flowLayoutPanel1.Controls.Add(lblmonthLimonade);
11: }
原始答案
显然,数组的所有元素都将包含相同的值reader.GetString("monthlyLimonade")
,它是结果集第一条记录的monthlyLimonade
列的值。
我认为你需要:
for (int i=0; i<12; i++)
{
reader.Read();
monthLimonade[i] = reader.GetString("monthlyLimonade");
}
但是为什么要使用这样的数组和变量呢?作为更好的选择,我建议使用DataTable
代替:
var dataTable = new DataTable();
var connection = @"your connection string";
var command = "your command";
var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(command, connection);
//Get data
dataAdapter.Fill(dataTable);
然后,您可以使用Rows
的{{1}}集合。
答案 1 :(得分:0)
monthLimonade[i] = reader.GetString("monthlyLimonade");
向数组插入相同的值。这就是为什么你有相同价值的问题。
答案 2 :(得分:-1)
既然你在循环中得到了正确的结果,也许你可以尝试从循环中解析和求和它自己?
String[] monthLimonade = new String[12];
int mlSum = 0;
for (int i = 0; i < 12; i++)
{
monthLimonade[i] = reader.GetString("monthlyLimonade");
mlSum += Int32.Parse(monthLimonade[i]);
}
因此,在循环的每次迭代中,您都会得到:
monthLimonade[0] = 2294.4
monthLimonade[1] = 3212.16
monthLimonade[2] = 4550.56
monthLimonade[3] = 5124
monthLimonade[4] = 7581
monthLimonade[5] = 6883
monthLimonade[6] = 10516
monthLimonade[7] = 6692
monthLimonade[8] = 8604
monthLimonade[9] = 10516
monthLimonade[10] = 0
monthLimonade[11] = 0
这应该归结为:
mlSum = 65973.12
这也应该允许您通过在循环中放置断点并查看Int.Parse每次是否正在解析reader.GetString("monthlyLimonade")
结果来更深入地调试。